一:__tostring函数能将各种类型的值表示为一种简单的文本格式,函数print总是调用其实参的__tostring来格式化其输出,__tostring会检查该值是否有一个__tostring的元方法。
local mt = {}
mt.__tostring = function( tbl )
local tmp = {}
for k in pairs(tbl) do
tmp[#tmp + 1] = k
end
return "{" .. table.concat(tmp,"/") .. "}"
end
local t = {1,2,3,4,5,0,9,8,7,a,bc}
setmetatable(t,mt)
print(t)
输出结果:
{1/2/3/4/5/6/7/8/9}
二:在lua代码中,只能设置table的元表。若要设置其他类型的值的元表,则必须通过C代码来实现。
三:关于table的key(table构造,table constructor)
a = {x=10,y=20} 等价于
a = {} a.x=10,a.y=20 也等价于
a={} a["x"] = 10, a["y"] = 20 也等价于
a = { ["x"]=10,["y"]=20}
四:关于table的长度
长度符号"#"用于返回一个数组或者线性表的最大索引值,或者返回一个字符串的字母总数。但是“#”遇到nil就会返回。看以下例子:
str = "aaga"
print(#str) -->3
a = {}
print(#a) -->0
a[99]=1
print(#a) -->0
print(table.maxn(a)) -->99
记住:table中所有未初始化的元素,索引的结果都是nil。lua将nil定界为数组或者线性表的结束标记。"#"操作符遇到nil值元素即结束返回。如果真的需要处理中间含有nil元素的table,就得使用table.maxn函数咯.
五:关于__index元方法
__index元方法不一定是一个函数,它还可以是一个table。当它是一个函数时,lua以table和一个不存在的Key作为参数来调用此函数。如下所示:
mt = {}
mt.__index = function (table, key)
return table[key]
end
而当它是一个table时,lua就以相同的方式来查找该table,如下所示:
mt={}
proto = {x=1,y=2,width=3,height=4}
mt.__index=proto
t = {x=100,y=20}
setmetatable(t,mt}
print(t.height)