Lua可以被C/C++ 代码调用,反过来也可以调用C/C++的函数,这使得Lua被广泛应用。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。Lua在目前解释型脚本引擎中,速度是最快的,这决定了Lua嵌入式脚本的最佳选择。文章列举lua使用中遇到的小问题,做个汇总。
if判断
lua把 nil 和false 视为“假”,其他都为“真”
local变量声明
local var1=1,var2
以上 ,var1和var2的作用域不同,var1是所在作用域的变量,var2可能是全局变量。实际上述命令解释后为 var1 取 "1,var2" 组成的值第一个值,类似 local var1 = ...
正确的写法是:
local var1, var2=1
table是否为空
if a == {} then
结果是false,这是一个逻辑错误,实际比较table a的内存地址和一个匿名table的是否相同
正确的写法是:
if next(a) == nil then
多个变量赋值
name,name = 1,2
那name等于多少呢?
实际上name值为1,可以写个小例子 a,b = 2,3,4打印汇编码就可以看到了。 方法:luac -l test.lua
table的key规则
t[name]与t["name"], t.name
第一种和后两种是不同的,第一种会根据取name的值做key,后两种以 "name"做key。这种情况还有:
t = {[name] = 1}
t = {name = 1}
t = {["name"] = 1}
table引用问题
将一个table复制给另外一个table,修改这个新的table值会影响原来的table,但通过clone可以改变这一行为。
-- 下面的代码,t2 是 t1 的引用,修改 t2 的属性时,t1 的内容也会发生变化
local t1 = {a = 1, b = 2}
local t2 = t1
t2.b = 3 -- t1 = {a = 1, b = 3} <-- t1.b 发生变化
-- clone() 返回 t1 的副本,修改 t2 不会影响 t1
local t1 = {a = 1, b = 2}
local t2 = clone(t1)
t2.b = 3 -- t1 = {a = 1, b = 2} <-- t1.b 不受影响
这里也补充一个深度复制的函数:
function table.deepcopy(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for index, value in pairs(object) do
new_table[_copy(index)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end
函数返回值
> function f123() return 1, 2, 3 end
> function f456() return 4, 5, 6 end
> print(f123(), f456())
1 4 5 6
> print(f456(), f123())
4 1 2 3
> print(f456())
4 5 6
> print(f456(),1)
4 1
如果函数不是处于列的最后一个,只返回一个值
CentOS 编译安装 Lua LuaSocket