instance_of?とis_a?の違い

instance_of?とis_a?の違いを、メモ。


以下のものを用いて実験

module Foo; end
module Bar; end

class Hoge
  include Foo
end

class Fuga < Hoge
  include Bar
end

fuga = Fuga.new

instance_of?

fuga.instance_of? Fuga #=> true
fuga.instance_of? Hoge #=> false
fuga.instance_of? Object #=> false
fuga.instance_of? Foo #=> false
fuga.instance_of? Bar #=> false
  • selfが、引数で指定されたクラスの直接のインスタンスの場合、trueを返す

is_a?メソッド

fuga.is_a? Fuga #=> true
fuga.is_a? Hoge #=> true
fuga.is_a? Object #=> true
fuga.is_a? Foo #=> true
fuga.is_a? Bar #=> true
  • selfが、引数で指定したクラスの直接のインスタンス、もしくは、そのサブクラスのインスタンスであれば、trueを返す
  • また、モジュールをインクルードしたクラス、もしくは、そのサブクラスのインスタンスであれば、trueを返す

kind_of?メソッド

# aliasを張っているだけなので、is_a?メソッドと同じ
# Hoge === fugaも同様

まとめ

  • instance_of?メソッドはその名の通り、そのクラスのインスタンスかどうかを判定


参考


以上です。
最後までお読みいただきありがとうございました。