36.Ruby|instance_of?/is_a?(kind_of?)

instance_of?(klass) -> bool

オブジェクトがクラス klass の直接のインスタンスである時、真を返します。

obj.instance_of?(c) が成立する時には、常に obj.kind_of?(c) も成立します。

[PARAM] klass:
Classかそのサブクラスのインスタンスです。

class C < Object
end
=> nil

class S < C
end
=> nil

obj = S.new
=> #<S:0x00007fdee60d2628>

p obj.instance_of?(S)
=> true

p obj.instance_of?(C)
=> false

docs.ruby-lang.org

is_a?(mod) -> bool

kind_of?(mod) -> bool

kind_of?is_a?エイリアス(なので同じ処理)。

オブジェクトが指定されたクラス mod かそのサブクラスのインスタンスであるとき真を返します。

また、オブジェクトがモジュール mod をインクルードしたクラスかそのサブクラスのインスタンスである場合にも真を返します。 Module#includeだけではなく、Object#extendやModule#prependによってサブクラスのインスタンスになる場合も含みます。上記のいずれでもない場合に false を返します。

[PARAM] mod:
クラスやモジュールなど、Moduleかそのサブクラスのインスタンスです。

module M
end
=> nil

class C < Object
   include M
end
=> C

class S < C
end
=> nil

obj = S.new
=> #<S:0x00007f94c892e370>

p obj.is_a?(S)
=> true

p obj.is_a?(C)
=> true

p obj.is_a?(Object)
=> true

p obj.is_a?(M)
=> true

p obj.is_a?(Hash)
=> false

 ↑ ※Moduleをクラスの中にインクルードしている。 インクルードされたModuleはインスタンスメソッドと同じ様に実行できる。

参考

Module

Moduleの使い方

  • 定数やメソッドをまとめる

  • クラスに組み込んで多重継承を実現する

  • 名前空間を提供する