加载、运行 - abbshr/Lua-newbie GitHub Wiki

虽然Lua 是解释型语言,但是 Lua 会首先把代码预编译成中间码然后再执行

模块加载

loadfile()函数可以加载文件作为chunk但不执行,loadfile会返回一个chunk函数,当调用这个函数时才执行chunk里的代码

loadstring()是从一个字符串中读入chunk,也是返回chunk函数不执行。之后的操作类似JS中的eval(),会在全局环境编译。ex:

function foo( ... )
    loadstring("local x = 1")()
    print(x)
end

foo()	--打印nil
print(x)	--打印nil

f = loadstring("function foo() print(123) end")
f()
foo()	--123

也就是说loadstring中字符串的执行环境是独立的chunk。因为lua把每一个chunk当作一个匿名函数处理:

loadstring("a = 1")

=>

function () a = 1 end

既然是在函数中,当然也可以返回(return)值。

如果loadstring函数发生错误会返回nil和错误信息

require()函数会判断文件是否已经加载,避免重复加载。

加载函数库

require使用的路径是模式列表,查找一个文件时将按如下模式进行:

?;?.lua;c:\windows\?.lua;/usr/local/lua/?/?.lua

抛出异常和错误处理

assert()函数提供了错误处理。ex:

n = assert(io.read(), "invalid!")

error()可以抛出错误