Rubyの勉強していたらNumeric#coerce
メソッドというものを見つけたのでメモ
機能
全ての数値オブジェクトに対して使えるメソッドで、引数で与えられた数を自分と同じクラスにして自分とセットで配列で返すものだそうです。
hoge = 1.6 hoge.coerce(5) => [5.0, 1.6]
呼び出し元の1.6
に引数で与えられた5
が変換され、IntegerからFloatになりました。
逆もできるかなーと。
hoge = 2 hoge.coerce(1.6) => [1.6, 2.0]
なぜかFloatになってしまった。
なんでやねんと思い、ソースを見たらまさかのC言語が出てきました。大分根っこまできたなあ。
static VALUE num_coerce(VALUE x, VALUE y) { if (CLASS_OF(x) == CLASS_OF(y)) return rb_assoc_new(y, x); x = rb_Float(x); y = rb_Float(y); return rb_assoc_new(y, x); }
ぱっと見た感じどちらもFloat型に変換しているっぽいです(rb_Floatあたり)。 仕様っぽいので、結構各クラスで変換後のクラスは別途定義しているようですね。 まとめてみよう
↓呼び出し元 →引数 | Integer | Float | Rational | Complex |
---|---|---|---|---|
Integer | Integer | Float | Float | Error |
Float | Float | Float | Float | Error |
Rational | Rational | Float | Rational | Complex |
Complex | Complex | Complex | Complex | Complex |
使い道
正直浮かばない