Я работал в 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. Таким образом, он отрицает целое число и вычитает один... по какой-то причине?
Может ли кто-нибудь просветить меня как цель уникального и неожиданного поведения тильды в рубине?