有没有办法实现类似于python的机制__getitem__
?
例如,具有以下内容:
local t1 = {a=1, b=2, c=3, d=4}
Run Code Online (Sandbox Code Playgroud)
如果在代码中,t1.e
将被调用,那么我希望有其他东西返回而不是nil
你可以使用setmetatable
和__index
metamethod:
local t1 = {a = 1, b = 2, c = 3, d = 4}
setmetatable(t1, {
__index = function(table, key)
return "something"
end
})
print(t1.hi) -- prints "something"
Run Code Online (Sandbox Code Playgroud)
请注意,执行此操作时不会调用此方法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"
Run Code Online (Sandbox Code Playgroud)