在Lua表中实现fallback/default-getter
问题描述:
有没有一种方法可以实现类似于python的__getitem__
的机制?在Lua表中实现fallback/default-getter
例如,具有以下内容:
local t1 = {a=1, b=2, c=3, d=4}
如果代码,t1.e
会叫,然后我希望有其他人返回,而不是nil
答
您可以使用setmetatable
东西和__index
元方法:
local t1 = {a = 1, b = 2, c = 3, d = 4}
setmetatable(t1, {
__index = function(table, key)
return "something"
end
})
print(t1.hi) -- prints "something"
请注意,当您执行此操作时不会调用t.nonexistant = something
。为此,您需要__newindex
metamethod:
local t1 = {a = 1, b = 2, c = 3, d = 4}
setmetatable(t1, {
__index = function(table, key)
return "something"
end,
__newindex = function(table, key, value)
rawset(table, tostring(key) .. '_nope', value)
end
})
print(t1.hi) -- prints "something"
t1.hi = 'asdf'
print(t1.hi) -- prints "something"
print(t1.hi_nope) -- prints "asdf"