【一人 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 :"!@" # => :"!@"
これは知らなかった。