ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

Rubyのcoerceメソッドについて

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

使い道

正直浮かばない