#lua #meta-method
#lua #мета-метод
Вопрос:
В lua 4.0 метод тегов «gettable» позволяет перехватывать доступ к элементам таблицы. Каждый раз, когда происходит попытка доступа к элементу таблицы, вызывается связанный метод тегов для события «gettable»:
local t = { a=123 }
local tg = newtag()
settagmethod(tg, "gettable",
function(tbl, idx) print(tbl, idx) return rawget(tbl, idx) end )
settag(t, tg)
print(t.a) -- <-- prints table: 0x7f9a8250acc0 a
-- <-- then prints t.a value
Что эквивалентно в Lua 5.xx?
Как мой код может вызывать метод каждый раз при обращении к таблице в Lua 5.x?
Комментарии:
1. В Lua 5.x вам нужна таблица прокси
2. Егор прав. Мой ответ (теперь удаленный) был неверным.
__index
вызывается только тогда, когда вызывающий пытается получить доступnil
к элементу.t[data]
в моем ответе было неверно! Это было на самом делеnil
. Я определилt.data
иt.data
эквивалентноt[“data”]
, неt[data]
. Но это приводит к тому, зачем вам нужна таблица прокси: если таблица, доступная для доступа, полностью пуста, то метаметоды __index и __newindex ВСЕГДА будут перехватываться. Затем эти методы могут получить доступ к другой таблице, которая в противном случае не видна.3. @brianolive, да, я понял, почему метаметод события __index работал не с tbl [data], а с tbl.data. @ Egor Skriptunoff, я использовал прокси-таблицу, это более простое решение, поскольку событие «settable» не существует в Lua 5.x …. было полезно в 4.0. В любом случае, я закончил использовать прокси-таблицу и для другого фрагмента кода в 4.01. Спасибо.