【一人 bugs.ruby Advent Calendar 2021】[Bug #18246] send does not work for unary ! operator when operator isn't a literal symbol【22日目】

一人 bugs.ruby Advent Calendar 2021 22日目の記事になります。
今日は ! 単項演算子send で呼び出す時の話です。

[Bug #18246] send does not work for unary ! operator when operator isn't a literal symbol

! 単項演算子send で呼び出すとエラーになるというバグ報告です。

# これは + 二項演算子を呼ぶ
1.send(:+, 2)    # => 3
1.send(:"+", 2)  # => 3

# これは - 単項演算子を呼ぶ
1.send(:-@)   #=> -1
1.send(:"-@") #=> -1

# これは ! 単項演算子を呼び出してほしい
# ok
false.send(:!@)   #=> true

# error: undefined method `!@' for false:FalseClass (NoMethodError)
false.send(:"!@")

1.send(:"-@") だと - 単項演算子を呼び出すが false.send(:"!@") だとエラーになってしまいます。
これは期待する挙動で ! 単項演算子を呼び出す場合は ! メソッド名で呼び出す必要があります。
なので

false.send(:"!") # => true

は問題なく動作します。
逆に false.send(:!@) がなぜ動くのかと言うと :!@ というシンボルは :! と等価なので結果的に false.send(:!@)false.send(:!) になるからです。

p :!@     # => :!
p :"!@"   # => :"!@"

これは知らなかった。