鸳鸯亭资源网 Design By www.gvabc.com

尽管Lua被称为是一种解释型的语言,但Lua确实允许在运行源代码之前,将源代码预编译成一种中间形式(类比Python的.pyc)。区别解释型语言的主要特征在于编译器是否是语言运行时库的一部分,即是否有能力执行动态生成的代码(Lua可以通过dofile执行Lua代码)。

 其实,dofile的核心功能是由loadfile完成的,可以这样来定义dofile:

Lua中的源代码预编译浅析

loadfile并不是执行代码,而只是编译,返回一个函数,由dofile执行。
如果多次运行一个文件,可以只调用一次loadfile,重复调用其返回的函数即可。
  
另外一个函数,loadstring从字符串加载代码:
复制代码 代码如下:
> f = loadstring('print "hello"')
> f()
hello

考察一下loadstring代码的执行域
复制代码 代码如下:
> i = 1
> f = loadstring('i = i + 1')
> =i
1
  
--不要完了交互式命令行中,一行代码默认一个block
  
> f = loadstring('i=i+1')
> do
local i =1
f()
print(i)
end
1
  
> do
local i = 1
local f = loadstring('i=i+1')
f()
print(i)
end
1

两次运行,都是将global中的i加1.
可以这样理解f:
复制代码 代码如下:
function f()
i = i+1
end

但如果直接替换,其结果并不一致。
复制代码 代码如下:
> do
local i =1
function f()
i = i + 1
end
f()
print(i)
end
2

可以认为,loadstring编译出的函数,会关联global scope,因而不会表现出闭包的特性,故而,应该尽量不使用这种方式!
  
另外,如果语法有误,那么loadstring返回nil。
可以使用assert(loadstring(s))()的方式。
如果参数不是nil/false,返回参数,否则assert error;
  
深究一下loadfile和loadstring就会知道,Lua中其实有一个load函数,后者接收一个reader function,调用其读取代码;

标签:
Lua,源代码,预编译

鸳鸯亭资源网 Design By www.gvabc.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
鸳鸯亭资源网 Design By www.gvabc.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?