в Lua 5.x что такое событие Lua 4.0 «gettable» и «settable», используемое для установки методов тегов (например, метаметодов)?

#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. Спасибо.