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 вызывается при попытке присвоить значение несуществующему ключу)

Другие вопросы по тегам