Lua 中的 table 由于定义的行为,我们可以对 key-value 对执行加操作,访问 key 对应的 value,遍历所有的 key-value。但是我们不可以对两个 table 执行加操作,也不可以比较两个表的大小。 Metatables允许我们改变 table 的行为,例如,使用 Metatables我们可以定义 Lua 如何计算两个 table 的相加操作 a+b。当 Lua 试图对两个表进行相加时,他会检查两个表是否有一个表有 Metatable,并且检查 Metatable 是否有__add 域。如果找到则调用这个__add函数(所谓的 Metamethod)去计算结果。
t = {}
m = { a = " and ", b = "Li Lei", c = "Han Meimei" }
setmetatable(t, { __index = m}) --表{ __index=m }作为表t的元表
for k, v in pairs(m) do --穷举表m
print(k, v)
end
print("-------------")
for k, v in pairs(t) do --穷举表t,无输出
print(k, v)
end
print("-------------")
print(t.b, t.a, t.c)
print("-------------")
print(m.b, m.a, m.c)
输出
>lua -e "io.stdout:setvbuf 'no'" "a.lua"a and
c Han Meimei
b Li Lei
-------------
-------------
Li Lei and Han Meimei
-------------
Li Lei and Han Meimei
>Exit code: 0
元表作为运算符重载:
function add(t1, t2)
--‘#’运算符取表长度
assert(#t1 == #t2)
local length = #t1
for i = 1, length do
t1[i] = t1[i] + t2[i]
end
return t1
end
--setmetatable返回被设置的表
t1 = setmetatable({ 1, 2, 3}, { __add= add })
t2 = setmetatable({ 10, 20, 30 }, {__add = add })
t1 = t1 + t2
for i = 1, #t1 do
print(t1[i])
end
从而能够做加法运算。