富贵资源网 Design By www.hznty.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,调用其读取代码;

富贵资源网 Design By www.hznty.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
富贵资源网 Design By www.hznty.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。