タイトルの通りです。
Rubyのような動的言語だといい感じに数値を処理してくれるので、Crystalでどのすればいいか案外たどり着かないと思って記事化しました。
オーバーロード
まずは、大前提としてのオーバーロードです。
型によって条件分岐が発生するときはこれがベストでしょう。
def your_method(x : Int32)
end
def your_method(x : Int64)
end
def your_method(x : Float32)
end
def your_method(x : Float64)
end
Int
と Float
整数と浮動小数点をまとめて引数に取りたい場合は、Int
と Float
が使えます。
def your_method(x : Int)
@x = x.to_i64
end
def your_method(x : Float)
@x = x.to_f64
end
Number
- 整数も、浮動小数点数もすべて引数に取る
def your_method(x : Number)
@x = x.to_i32 # 例
end
これで任意の型の数値を取ることができます。
BigDecimal
と BigFloat
を引数に取りたい場合
このほかに特殊な型として BigDecimal
BigFloat
があります。これらは、Number
を継承しません。なのでこれらを Number
と一緒に扱う場合はオーバーロードが必要です。
BigDecimalが十進数の計算に適しておりCrystalで実装されているのに対して、BigFloatはGMPを内部で利用しており任意制度の二進浮動小数点の計算に向いているそうです。金融計算ではBigDecimal、科学計算ではBigFloatを使うといいみたいですね。
Crystalの数値型のまとめ
-
Number
(抽象基底型)-
Int
(整数の抽象基底型)-
Int8
,Int16
,Int32
,Int64
,Int128
-
UInt8
,UInt16
,UInt32
,UInt64
,UInt128
-
-
Float
(浮動小数点の抽象基底型)-
Float32
,Float64
-
-
BigDecimal
とBigFloat
は独立した型として定義されており、Number
を継承しない。
この記事は以上です。