Луа метаметоды не называются - PullRequest
3 голосов
/ 26 июня 2010

Я в некотором роде новичок в Lua (пока не особо много с этим делаю) и пытаюсь сосредоточиться на метатаблицах.Раньше они работали, но сейчас (через несколько месяцев) я столкнулся с чем-то действительно странным.

Что должен печатать этот скрипт при запуске?

__mt = {}

__mt.__index = function(table, key)
    print("In __index")
    return 99
end

test = {}
test.x = 5

setmetatable(test, __mt)

print(test.x)

Лично я бы ожидалчтобы напечатать «In __index» (из метаметода), за которым следует 99. Однако, когда я запускаю его, я получаю 5. Ничто из того, что я делаю, не может запустить метаметод индекса.Это просто действует так, как будто я использую rawget().

Любопытно, что добавление

print(getmetatable(test).__index(test, "x"))

сделает правильную вещь.Метатабель есть, __index() - это правильно, просто его не вызывают.

Это ошибка или я просто делаю что-то глупое?Я не могу сказать.

1 Ответ

8 голосов
/ 26 июня 2010

Метаметод (в старой терминологии также называемый fallback ) с именем __index вызывается только в том случае, если ключ x не существует в таблице при доступе к t.x. Попробуйте print(t.y) вместо!

Добавлено: Да, с использованием прокси-таблицы.

function doubletable(T)
  local store = T or {}
  local mt = {}
  mt.__index = function (t, k) return store[k] and 2*store[k] end
  mt.__newindex = store
  return setmetatable({}, mt)
end

t = doubletable({a=1, b=3})
t.c = 7
print(t.a, t.b, t.c)
-- output: 2    6   14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...