lua load

摘要:
load加载一个代码块。如果chunk是一个函数,load不断地调用它获取代码块的片断。Lua不会对二进制代码块做健壮性检查。skynetcluster里的应用1localfunctionloadconfig2iftmp==nilthen3tmp={}4ifconfig_namethen5localf=assert6localsource=f:read"*a"7f:close()8assert()9end10end11forname,addressinpairsdo12assert13ifnode_address[name]~=addressthen14--addresschanged15ifrawgetthen16node_channel[name]=nil--resetconnection17end18node_address[name]=address19end20end21endhttp://blog.csdn.net/snlscript/article/details/17168861前面一篇博文提到了,用load函数实现Lua的反射机制,但是没有深入的讲解load的用法。load的本质就是在Lua代码中运行一段存储在字符串中的代码。但很快你会发现,它并不是将字符串去掉“引号”那么简单,如:[plain]viewplaincopyb=200print解析器毫不犹豫的给你一个error。因为load有另一层含义,它是将字符串的内容作为一个函数体返回。

load (chunk [, chunkname [, mode [, env]]])

加载一个代码块。

如果chunk是一个字符串,代码块指这个字符串。 如果chunk是一个函数,load不断地调用它获取代码块的片断。 每次对chunk的调用都必须返回一个字符串紧紧连接在上次调用的返回串之后。 当返回空串、nil、或是不返回值时,都表示代码块结束。

如果没有语法错误, 则以函数形式返回编译好的代码块; 否则,返回nil加上错误消息。

如果结果函数有上值,env被设为第一个上值。 若不提供此参数,将全局环境替代它。 所有其它上值初始化为nil。 (当你加载主代码块时候,结果函数一定有且仅有一个上值_ENV(参见§2.2))。 然而,如果你加载一个用函数(参见string.dump, 结果函数可以有任意数量的上值) 创建出来的二进制代码块时,所有的上值都是新创建出来的。 也就是说它们不会和别的任何函数共享。

chunkname在错误消息和调试消息中(参见§4.9),用于代码块的名字。 如果不提供此参数,它默认为字符串chunkchunk不是字符串时,则为 "=(load)" 。

字符串mode用于控制代码块是文本还是二进制(即预编译代码块)。 它可以是字符串 "b" (只能是二进制代码块), "t" (只能是文本代码块), 或 "bt" (可以是二进制也可以是文本)。 默认值为 "bt"。

Lua 不会对二进制代码块做健壮性检查。 恶意构造一个二进制块有可能把解释器弄崩溃。

skynet cluster里的应用

1 local functionloadconfig(tmp)
2     if tmp == nil then
3         tmp ={}
4         if config_name then
5             local f = assert(io.open(config_name))
6             local source = f:read "*a"
7 f:close()
8             assert(load(source, "@"..config_name, "t", tmp))()
9         end
10     end
11     for name,address in pairs(tmp) do
12         assert(type(address) == "string")
13         if node_address[name] ~= address then
14             --address changed
15             if rawget(node_channel, name) then
16                 node_channel[name] = nil    --reset connection
17             end
18             node_address[name] =address
19         end
20     end
21 end

http://blog.csdn.net/snlscript/article/details/17168861

前面一篇博文提到了,用load函数实现Lua的反射机制,但是没有深入的讲解load的用法。load的本质就是在Lua代码中运行一段存储在字符串中的代码。但很快你会发现,它并不是将字符串去掉“引号”那么简单,如:

  1. b=200
  2. print(load("b"))

解析器毫不犹豫的给你一个error。因为load有另一层含义,它是将字符串的内容作为一个函数体返回。所以以下代码才是正确的使用方法:

  1. b=200
  2. print(load("returnb")())

将上面的代码其实等同于:

  1. b=200
  2. functionfunc()
  3. returnb
  4. end
  5. print(func())
  1. load("returnb")就等于函数:
  2. functionfunc()
  3. returnb
  4. end

经过上面的试验,我们知道了load封装了一个以字符串内容为函数体的函数,所以我们用同样的方法在load中传入一个函数名:

  1. functionadd(a,b)
  2. returna+b
  3. end
  4. value=load("returnadd")()
  5. print(value(1,2))
  6. --就等于:
  7. functionfunc()
  8. returnadd
  9. end
  10. value=func()
  11. print(value(1,2))

免责声明:文章转载自《lua load》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webpack -- element-ui 的按需引入微信小程序轮播图组件 swiper,swiper-item及轮播图片自适应下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

lua if 流程控制

Lua认为false和nil为假,true和非nil为真。 要注意的是Lua中 0 为 true --[ 0 为 true ] if(0) then print("0 为 true") end 输出 0 为 true 实例 --[ 定义变量 --] a = 10--[ 使用 if 语句 --] if( a < 20 ) then...

关于 Lua 内存泄漏的检测

前一阵开始和同事一起优化内存,首先是优化 Lua 内存,因为发现每次战斗完后 Lua 内存非常大,从 3M 左右在经过了10次左右的战斗后,会暴增到近 100M,很明显是有内存泄漏。 然后我正式启动该工作,基本思路就是递归遍历内存中所有的数据,表,函数,协程,用户数据,查看未释放和笔误引起的全局变量泄漏;于是通过搜索我参考了以下资料: http://sha...

什么是哈希

什么是哈希   把任意长度的输入通过散列算法变换成固定长度的输出,称为哈希(hash),又称散列 为什么是哈希不可逆 就像1+4=5和2+3=5一样,你现在知道我的结果是5,能知道我输入的什么数字吗? 哈希算法的概念和特性 我们前面分享了散列表、散列函数和散列冲突,其实也可以译作哈希表、哈希函数和哈希冲突,是一个意思。哈希算法简单理解就是实现前面提到的哈...

十进制,八进制,十六进制,二进制相互转换大全

轉自:http://blog.programfan.com/article.asp?id=11903   ' 用途:将十进制转化为二进制' 输入:Dec(十进制数)' 输入数据类型:Long' 输出:DEC_to_BIN(二进制数)' 输出数据类型:String' 输入的最大数为2147483647,输出最大数为111111111111111111111...

Mysql数据类型

MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 1.数值类型 MySQL支持所有标准SQL数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、...

Golang中使用lua进行扩展

前言 最近在项目中需要使用lua进行扩展,发现github上有一个用golang编写的lua虚拟机,名字叫做gopher-lua.使用后发现还不错,借此分享给大家. 数据类型 lua中的数据类型与golang中的数据类型对应关系作者已经在文档中说明,值得注意的是类型是以L开头的,类型的名称是以LT开头的.golang中的数据转换为lua中的数据就必须转...