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