在Lua的表中实现fallback/default-getter

Tzu*_*hay 2 lua

有没有办法实现类似于python的机制__getitem__

例如,具有以下内容:

local t1 = {a=1, b=2, c=3, d=4} 
Run Code Online (Sandbox Code Playgroud)

如果在代码中,t1.e将被调用,那么我希望有其他东西返回而不是nil

Set*_*gie 6

你可以使用setmetatable__indexmetamethod:

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.为此,您需要__newindexmetamethod:

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)