Float Classの `-' メソッドを上手く再定義出来ない
ginzanomamaさんのブログは更新が多くて勉強になるので好きです。
昨日更新されたrubyの演算子を再定義するとFloatがなんか変 - みんなのちからになりたいという記事が面白かったので僕も試してみました。
class Float ['+', '-', '*', '/'].each do |num| define_method(num) do |other| "SUCCESS" end end end
以下僕のデバッグ(pがあると読みづらいので意図的に消しています)
x = 1.0 y = 1.0 x + y #=> "SUCCESS" x - y #=> 0.0 x - y.to_i #=> "SUCCESS"
あれれ?
x - y.to_s #=> "SUCCESS" x - y.class #=> "SUCCESS" x - "success" #=> "SUCCESS" x - y.to_f #=> 0.0
小数点同士の引き算の場合のみ、再定義したはずの`-'メソッドが呼び出されないようですね。
ということは、Floatの`-'メソッドはFloatのサブクラスで定義されていたりするんですかね?
Floatの`-'メソッドが再定義出来ない演算子に指定されている可能性も考えましたが......ううむ.......。
帰宅したらもう一度考えてみます
追記
数時間後
@nekonikovaaaan 2.0だと正しく動いた(1.9.3は動かない)
— でーき (@deeeki) March 14, 2013
@deeeki @nekonikovaaaan https://t.co/n6EZr480pi
Numeric#coerce が呼ばれたときでないとRubyのメソッドとして呼ばれていないように見えます…。そんなものなのかしら。これ以上はCのソースにあるんですかね
— Uchio KONDO (@udzura) March 14, 2013
@deeeki @nekonikovaaaan あ、それで、メソッドを自分で定義するとcoerce無しの場合も呼ばれるようになるんですが、1.9.3の場合で#-の時みスルーされちゃいますw なので、1.9.3でのバグが2.0.0で直ったと言うことだと思われます。チケット探し中…
— Uchio KONDO (@udzura) March 14, 2013
@deeeki @nekonikovaaaan https://t.co/PpoC1Ysj0u
— Uchio KONDO (@udzura) March 14, 2013