欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lua探路(3):编译、执行、错误

程序员文章站 2024-03-17 23:14:22
...

编译

区分解释型语言的主要特征不是能否去编译它们,而是在编译器是否是运行时库的一部分,是否有能力执行动态生成的代码。

dofile:实际是调用loadfile,从文件加载lua代码,编译并运行,会引发错误

loadfile:从文件加载lua代码,编译但不运行(编译成函数,作为匿名函数返回),不会引发错误,有错误时只是返回错误值
源代码 foo.lua

function foo(x)
 -- body
 print(x)
end

运行:

f = loadfile("foo.lua") --只是返回了函数,但没有执行
print(foo)    --nil
f()               --定义foo函数
foo("ok")    --ok

load(低版本中是loadstring):从一个字符串读取代码,返回一个函数。(比直接定义函数写代码慢得多)

i = 32
local i = 0
f = load("i = i+1;print(i)") --load总是在全局环境中编译的,所以这里访问到的i是全局变量i
g = function() i = i+1;print(i) end

f()
g()

--输出 33  1

C代码调用
需要使用前先链接入应用程序
loadlib函数加载指定的库,并将其链接入Lua:将C函数作为Lua函数返回

local path = "/usr/local/lib/lua/5.1/socket.so"
local f = package.loadlib(path, "luaopen_socket")

错误(error)

只要发生错误,Lua就会结束当前程序块并返回应用程序error

if not n then
error("invalid input") --显示抛出错误信息
end

assert(p1, p2):如果p1为true,就简单返回该参数,否者引发一个错误。p2是错误信息,可选


错误处理和异常
function fun( ... )
 -- body
 print("fun")
 error("exception")
end

local status, err = pcall(fun)
if status then
 --运行fun时没有发生错误
 print("not have error")
else
 --错误处理代码
 print("have error")
 print(err) --只要错误消息是字符串,Lua就会附加一些错误发生位置的信息
end
相关标签: Lua