Lua 5.3 переопределение оператора ~ (__bnot) для целых значений с использованием debug.setmetatable

#lua #operator-overloading

#lua #перегрузка оператора

Вопрос:

Этот пример

 debug.setmetatable(0,
{
    __bnot = function(a) -- ~ operator
        print("yay ".. a)
        return a
    end
})
print(~ (0))
print(~ (0.3))
print(~ (1))
print(~ (2))
print(~ (2.1))
  

Выводит следующее

 -1
yay 0.3
0.3
-2
-3
yay 2.1
2.1
  

Я ожидал

 yay 0
0
yay 0.3
0.3
yay 1
1
yay 2
2
yay 2.1
2.1
  

Похоже, что он не вызывается для целых значений.

Как переопределить оператор not для всех чисел?

Комментарии:

1. Согласно lua.org/manual/5.3/manual.html «Значения всех других типов имеют одну метатаблицу для каждого типа; то есть для всех чисел существует одна метатаблица» Итак, чего мне не хватает?

Ответ №1:

Согласно комментариям: Вы не можете переопределить все с помощью метода. Метаметоды являются резервными в Lua. Вы можете реализовать только операции, которые не были определены на языке Lua. Например, побитовые операции над числами, имеющими ненулевую дробную часть, не были определены.