There's an echo in my head

日々のメモ。

Integer Unificationの判定方法

CRuby 2.4から整数がIntegerに統合されるとともにその子クラスであるFixnumとBignumが廃止されたが、下記のようなコードを使えばそれを手軽に判定できる。

if 1.class.name == "Integer"
  # 統合後の処理
else
  # 統合前の処理
end

このようにバージョン番号を使わずに判定することで、JRubyなどの別実装で同様の変更がかかっても同じコードで対応できる。

ちなみにdefined?(Fixnum)でも同じ判定ができるんだろうけど、

  • Fixnumがなにがしかで引き続き定義されてたら期待通りに動かない
    • 手軽に互換性を維持しようとしてclass Fixnum < Integer; endしてるとか
  • Bignumが忘れられてるようでかわいそう

といったあたりが気になるので、今回のような判定方法のほうが個人的には好き。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。