Я работал в REPL и нашел очень интересное поведение: метод тильды.
Кажется, синтаксис Ruby имеет встроенный литеральный унарный оператор, ~
, просто сидящий.
Это означает, что ~Object.new
отправляет сообщение ~
экземпляру Object
:
class Object
def ~
puts 'what are you doing, ruby?'
end
end
~Object.new #=> what are you doing, ruby?
Это кажется действительно крутым, но загадочным. Действительно ли Мац пытается дать нам собственный настраиваемый унарный оператор?
Единственная ссылка, которую я могу найти в rubydocs, находится в примечаниях о приоритете оператора, где она была ранжирована как оператор с наивысшим приоритетом номер один !
и unary +
Это имеет смысл для унарных операторов. (Для интересных ошибок относительно следующих двух уровней приоритета **
затем unary -
, проверьте этот вопрос.) Кроме того, не упоминается об этой утилите.
Две заметные ссылки на этот оператор можно найти путем поиска среди вопросов ~=,
,! ~ , and
~>, это и это. Они оба отмечают свою полезность, странность и безвестность, не вдаваясь в ее историю.
После того, как я собирался списать ~
как классный способ предоставить пользовательское поведение унарного оператора для ваших объектов, я нашел место, где его фактически использовали в ruby - fixnum (integers).
~2
возвращает -3
. ~-1
возвращает 1
. Таким образом, он отрицает целое число и вычитает один... по какой-то причине?
Может ли кто-нибудь просветить меня как цель уникального и неожиданного поведения тильды в рубине?