tolua++ игнорирует оператор присваивания и неравенства?
Я встраиваю Lua в класс C++.
Кажется, что tolua ++ игнорирует некоторые перегруженные операторы моего класса.
tolua ++ выдает следующие предупреждения:
- ** предупреждение tolua ++: нет поддержки оператора =, игнорируется
- ** tolua ++ предупреждение: нет поддержки оператора!=, игнорируя
Есть ли способ обойти это?
1 ответ
Я не знаком с tolua++, но имеет смысл, что он не будет поддерживать ни один из них. tolua++ просто вежливо информирует вас, чтобы вы не думали, что код оказывает какое-либо влияние.
Оператор присваивания не имеет смысла в контексте Lua, а ~=
оператор отрицание==
так реализуя operator==
заботится о обоих ==
а также ~=
для вашего объекта Lua.
РЕДАКТИРОВАТЬ: Используя это место, чтобы ответить на вопрос, поставленный ниже, чтобы я мог включить код:
Правда, это объясняет соотношение неравенства, но как насчет назначения?
В Lua переменные не типизированы, это просто имена для значений. Оператор присваивания связывает новое значение любого типа с этим именем, он не изменяет предыдущее значение, связанное с именем (например, это значение существует где-то в памяти, не изменяется, ожидая сбора мусора, если на него больше нет ссылок существовать). Подумайте, что означает назначение для глобальной переменной:
print(math) --> table: 00516620
math = "foo"
print(math) --> foo
Эта вторая строка эквивалентна:
_G.math = "foo"
Другими словами, math=val
заменяет значение в _G["math"]
так что это значит переопределить operator=
для математического объекта? Ничего такого.
Наиболее близким к изменению оператора присваивания является __newindex
metamethod, который применяется только к таблицам /userdata, поэтому не будет влиять на местных жителей. В случае нашего math="foo"
Например, __newindex
будет на _G
не math
и даже не будет вызываться в этом случае, потому что _G.math
имеет существующее значение (__newindex
вызывается при попытке присвоить значение несуществующему ключу)