реализация fallback / default-getter в таблицах Lua - PullRequest
2 голосов
/ 13 декабря 2011

Есть ли способ реализовать механизм, похожий на __getitem__?

Python?

например, имеющий следующее:

local t1 = {a=1, b=2, c=3, d=4} 

если в коде будет вызываться t1.e, то я хочу получить что-то еще, а не nil

1 Ответ

6 голосов
/ 13 декабря 2011

Вы можете использовать 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:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...