zoukankan      html  css  js  c++  java
  • lua load

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

    加载一个代码块。

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

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

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

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

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

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

    skynet cluster里的应用

     1 local function loadconfig(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代码中运行一段存储在字符串中的代码。但很快你会发现,它并不是将字符串去掉“引号”那么简单,如:

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. b = 200  
    2. print(load("b"))  

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

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. b = 200  
    2. print(load("return b")())  

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

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. b = 200  
    2. function func()  
    3.     return b  
    4. end  
    5. print(func())  
    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. load("return b") 就等于函数:  
    2. function func()  
    3.     return b  
    4. end  

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

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. function add(a, b)  
    2.      return a + b  
    3. end  
    4.   
    5. value = load("return add")()  
    6. print(value(1, 2))  
    7. --就等于:  
    8.   
    9. function func()  
    10.      return add  
    11. end  
    12. value = func()  
    13. print(value(1, 2))  



  • 相关阅读:
    审核系统
    ehcache 缓存
    tomcat 内存设置
    html5 开发 跨平台 桌面应用
    service thread 结合使用
    html5桌面应用
    鼠标 事件
    服务器 判断 客户端 文件下载
    使用github管理Eclipse分布式项目开发
    uub代码
  • 原文地址:https://www.cnblogs.com/vanishfan/p/6856142.html
Copyright © 2011-2022 走看看