设为首页 加入收藏

TOP

总结Lua使用中遇到的小问题
2015-11-10 13:45:42 来源: 作者: 【 】 浏览:8
Tags:总结 Lua 使用 遇到 问题

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
如果函数不是处于列的最后一个,只返回一个值


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇libcurl库的使用(通过libcurl库下.. 下一篇如何识别Java中的内存泄漏

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: