Lua 的基本语法
Lua 的基本内容 值和类型 8 中基本类型 类型 说明 nil nil类型只有一个值,通常表示不存在有用的值 boolean nil 和 false 为假,其余均为真值 number 整数和浮点数 string 不可变的字节序列 function userdata 用户数据值在 Lua 中无法创建或修改,只能通过 C API 进行创建或修改 thread 线程类型 table 关联数组 表、函数、线程和(完整的)用户数据值都是对象 :变量实际上并不包含这些值,而只是对它们的引用 。赋值、参数传递和函数返回始终操作的是对这些值的引用;这些操作不涉及任何形式的复制。 环境和全局变量 Lua 把你没定义过的变量,都当作是 _ENV 这个表里的成员。_ENV 就是一个普通的 Lua 表(table),它用来当“作用域环境”。默认这个 _ENV 就是 _G 也就是平时说的全局变量表。 -- _ENV 可以被改掉 local _ENV = {print = function() print("你被劫持了") end} -- 如果要加载一个 lua 脚本,不想让它访问全局变量,可以使用 load / loadfile local f = load("print(x)", nil, "t", { print = print, x = 123 }) f() -- 输出 123 -- 这个 { print = print, x = 123 } 就是传给这个脚本的 _ENV,它用来隔离变量作用域 错误处理 功能 用法说明 抛出错误 error(“错误了”) 捕获错误 pcall(function) 带堆栈处理器 xpcall(func, handler) 错误值 可以是字符串、table、数字……任意值 警告机制 只提示不影响程序运行,从 Lua 5.4 开始支持 -- 抛出错误 --error("发生了致命错误") -- pcall 捕获错误 local ok, result = pcall(function() error("boom") end) print(ok) print(result) -- 自定义处理错误 xpcall local function my_func() error("出问题了") end local function my_handler(err) return "捕获错误: " .. err .. "\n" .. debug.traceback() end local ok, msg = xpcall(my_func, my_handler) print(msg) 自定义错误处理 local function log_error(msg) io.stderr:write("[ERROR] " .. os.date() .. "\n" .. msg .. "\n") end function safe_call(fn, ...) local args = { ... } local function error_handler(err) local msg = tostring(err) local trace = debug.traceback("", 2) local full_msg = "【Lua错误】" .. msg .. "\n" .. trace log_error(full_msg) return full_msg end local function wrapped() return fn(table.unpack(args)) end local ok, result = xpcall(wrapped, error_handler) return ok, result end local function demo(a, b) return a / b end local ok, res = safe_call(demo, 10, 0) if not ok then print("执行失败: ") print(res) else print("执行成功,结果是: " .. res) end 元表和元方法 Lua 的 metatables 和 metamethods 允许自定义 lua 对象的行为。 ...