在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"