• LUA学习笔记3 - Compilation, Execution, and Errors
    时间:2008-09-03   作者:佚名   出处:互联网

    Compilation, Execution, and Errors
    前面我们介绍过dofile函数, 其实dofile的实现如下:
        function dofile (filename)
          local f = assert(loadfile(filename))
          return f()
        end
    loadfile函数很灵活, 我们可以多次调用loadfile的返回结果来反复执行一段代码. 但是如果出错loadfile将返回nil和一个错误提示信息.
    loadstring功能和loadfile类似, 参数为要直接处理的script内容.
        f = loadstring("i = i + 1")
        i = 0
        f(); print(i)   --> 1
        f(); print(i)   --> 2

    loadstring载入后相当于多了一个匿名函数定义,
    -- file `foo.lua'
        function foo (x)
          print(x)
        end

        f = loadfile("foo.lua")
        f()           -- defines `foo'
        foo("ok")     --> ok

    你也可以使用loadstring(s)()达到同样的效果.
    使用loadstring时所用的变量都位于全局空间:
        local i = 0
        f = loadstring("i = i + 1")      -- global i
        g = function () i = i + 1 end    --local i

    The require Function
    Lua提供了一个函数require用来载入库. require作的工作有些像dofile但有两点重要不同:require会在path指定的路径搜索文件, 而且require可以知道一个文件是否已被执行, 如果已被执行过, 那么不会再次被执行.

    Lua使用的path和许多平台使用的标准path有些不同, 许多平台使用的path是一系列含有目标文件的文件夹,但是Lua不一样. Lua使用的ANSI C语言并没有path这样的概念, 因此Lua使用的是字符串匹配的方式. '?'代表文件名, 以';'隔开.
    ?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
    如果调用 require 'lili', 那么会尝试打开下列文件:
    lili
    lili.lua
    c:\windows\lili
    /usr/local/lua/lili/lili.lua
    require会首先检查全局变量LUA_PATH, 如果LUA_PATH是一个字符串类型, 那么使用它的值. 否则检查环境变量LUA_PATH, 如果以上值都不存在, 那么使用一个定值, 这个值可以在编译LUA的时候方便的加以改变.

    另一个require的主要功能是避免一个文件被执行多次. 为了实现这个目的, 它保存了一个table用来记录所有已经载入的文件. 注意, 这里的key值并不是真实的文件名而是一个虚拟文件名. 所以
    require "foo"
    require "foo.lua"
    path是"?;?.lua", 那么foo.lua会被载入两次. 可以通过全局变量 _LOADED 访问到这个表的值.
    path中可以含有固定文件的值, 例如:
    ?;?.lua;/usr/local/default.lua
    在这种情况下, 如果 reqire 不能找到其他的匹配, 那么就使用/usr/local/default.lua.

    网友留言/评论

    我要留言/评论