pairs遍历表中全部key,value
ipairs从下标为1开始遍历,然后下标累加1,如果某个下标元素不存在就终止遍历。这就导致如果下标不连续或者不是从1开始的表就会中断或者遍历不到元素。
a={[1]="a",[2]="b",[3]="c",[4]="d",[5]="e"};
for k,v in ipairs(a) do
print(k,v);
end
print("--------------")
for k,v in pairs(a) do
print(k,v)
end
输出结果
1 a
2 b
3 c
4 d
2 b
3 c
1 a
4 d
5 e
rawget(table,key),作用是可以绕过__index
rawset(table,key,value),作用是可以绕过__newindex
Window = {x = 0, y = 0, width = 100, height = 100}
setmetatable(Window, Window);
Window.__index = function (t, k) return 1000; end
Window.__newindex = function (t, k, v) print("no!") end
print(Window.a);
print(rawget(Window, a));
Window.b = 1;
print(Window.b);
rawset(Window, "b", 500);
print(Window.b);
那么,一个不错的方法:
Window.__newindex = function (t, k, v) rawset(Window, k, v); end
mytable = setmetatable({key1 = "value1"}, {
__newindex = function(mytable, key, value)
rawset(mytable, key, "\""..value.."\"")
end
})
mytable.key1 = "new value"
mytable.key2 = 4
print(mytable.key1,mytable.key2)
pcall & xpcall(发生错误时不会中断程序) aseert & error (发生错误时会中断程序)
function A(i)
print(i);
end
function B(i)
print(i);
error("a error!!");
end
print(pcall(A,33));
print(pcall(B,34));
print("-----------");
function C()
print("进行错误处理");
end
xpcall(A,C);
xpcall(B,C);
local function add(a,b)
assert(type(a) == "number", "a 不是一个数字")
assert(type(b) == "number", "b 不是一个数字")
return a+b
end
add(10)
功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)通常情况下,error会附加一些错误位置的信息到message头部。
Level参数指示获得错误的位置:
Level=1[默认]:为调用error位置(文件+行号)
Level=2:指出哪个调用error的函数的函数
Level=0:不添加错误位置信息
--error
error (message [, level])