Есть ли способ определить, что вызов __index является последним в цепочке в Lua? - PullRequest
2 голосов
/ 22 марта 2020

Я работаю над интеграцией Lua с C ++. Я хочу иметь возможность выставлять значения C ++ в Lua иерархическим способом, который может не соответствовать тому, как значения хранятся на стороне C ++. Я хочу иметь возможность сделать что-то вроде

a.b.c = 5
print(a.b.c)

, и функция a на стороне C ++ получит 'a', 'b', 'c' и 5 для первого случая и просто ' a ',' b ',' c 'для второго случая. Для этого я создал таблицу, содержащую ключи и метатаблицу, чьи методы __index и __newindex заботятся о логи c, сейчас это выглядит примерно так:

 metatable.__index = function(t, k)
            rawset(t, t.index, k)
            t.index = t.index + 1
            return t
    end

metatable.__newindex = function(t, k, v)
        rawset(t, t.index, k)
        return newindexCallback(t, v)
    end

Это прекрасно работает для установки значений, но получение значений не работает, потому что a.b.c приводит к таблице, а не к фактическому значению. Есть ли способ для метода __index узнать, что он последний в цепочке? Или другой метаметод, который вызывается, когда значение действительно используется? Или я должен прибегнуть к использованию геттеров и сеттеров?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...