(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) end end foo(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 expected
stack traceback:
[C]: in function 'error'
test.lua:4: in function 'foo'
test.lua:9: in main chunk
[C]: ?
>Exit code: 1