コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyの生成されたインスタンスのクラスを調べるときはinstance_of?とkind_of?(is_a?)を使い分ける

エイリアスかと思ったら違うのでちゃんと記述する

環境

$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19]

概要

生成されたインスタンスのクラスを調べたいときは instance_of? を使う。継承元のクラスも含めて調べたいときは kind_of? あるいは is_a? を使う。

実例

Exceptionクラスを継承しているStandardErrorクラスをベースに説明する。

error = StandardError.new
# => #<StandardError: StandardError>

継承関係まで見る kind_of?is_a? は継承元のExceptionでもtrueになるが、 instance_of? は生成したクラスのみにtrue反応をする

error.kind_of?(StandardError)
# => true
error.kind_of?(Exception)
# => true
error.is_a?(Exception)
# => true
error.instance_of?(Exception)
# => false
error.instance_of?(StandardError)
# => true

参考リンク