(dofile - loadfile)
dofile从LUA源码读入chunk编译为字节码并执行,loadfile则是执行字节码。
function dofile (filename) local f = assert(loadfile(filename)) return f() end
(loadstring)
loadstring与loadfile 相似,只不过它不是从文件里读入chunk ,而是从一个串中读入。
local s = "print('LUA')"assert(loadstring(s))()
(require)
Lua 提供高级的 require 函数来加载运行库。粗略的说require 和dofile 完成同样的功
能但有两点不同: 1. require 会搜索目录加载文件 2. require 会判断是否文件已经加载避免重复加载同一文件。由于上述特征,require在Lua 中是加载库的更好的函数。
(C Packages)
local path = "/usr/local/lua/lib/libluasocket.so"local f = loadlib(path, "luaopen_socket")
lua程序中使用loadlib导入动态库,出现错误
attempt to call global 'loadlib' (a nil value)
修正方法:
luaconf.h文件中,
将#undef LUA_COMPAT_LOADLIB改成#define LUA_COMPAT_LOADLIB重新编译一个luac可执行文件。OK!!!
(异常和错误处理以及traceback)
如果在Lua 中需要处理错误,需要使用pcall 函数封装你的代码。
local status, err = pcall(function () error({code=121}) end ) print(err.code) --> 121
function foo (str) if type(str) ~= "string" then print(debug.traceback()) error("string expected", 2) endendfoo(LUA)
>lua -e "io.stdout:setvbuf 'no'" "test.lua"
stack traceback: test.lua:3: in function 'foo' test.lua:9: in main chunk [C]: ?lua: test.lua:9: string expectedstack traceback: [C]: in function 'error' test.lua:4: in function 'foo' test.lua:9: in main chunk [C]: ?>Exit code: 1