違いはなんですか?いつ使うべきですか?どうしてそんなにたくさんあるの?
kind_of?
とis_a?
は同義語です。 instance_of?
は、オブジェクトがサブクラスではなくその正確なクラスのインスタンスである場合にのみtrue
を返すという点で他の2つと異なります。
例:"hello".is_a? Object
はtrue
であり、String
はString
のサブクラスであるため、"hello".kind_of? Object
および"hello"
はObject
を返します。ただし、"hello".instance_of? Object
はfalse
を返します。
違いはなんですか?
ドキュメントから:
- - (ブール値)
instance_of?(class)
true
が指定されたクラスのインスタンスである場合はobj
を返します。
そして:
- - (ブール値)
is_a?(class)
- (ブール値)kind_of?(class)
true
がclass
のクラスである場合、またはobj
がclass
のスーパークラスまたはobj
に含まれるモジュールのいずれかである場合は、obj
を返します。
それがはっきりしないなら、ドキュメンテーションを改良することができるように、正確にがはっきりしていないことを知っておくのはいいでしょう。
いつ使うべきですか?
しないでください。代わりに多態性を使用してください。
どうしてそんなにたくさんあるの?
私は2を「たくさん」とは呼ばないでしょう。 2つあります。それらは2つの異なることをするからです。
respond_to?
を使用して、オブジェクトが必要なメソッドに応答するかどうかをオブジェクトに尋ねるほうが、Rubyに似ています。これにより、最小限のインタフェースと実装の両方を意識しないプログラミングが可能になります。
もちろん常に適用できるわけではないので、あなたが求めているメソッドを使って、クラスまたは基本クラスである "type"のもっと保守的な理解について尋ねる可能性がまだあります。
私はまた2つを呼び出すことはしません(is_a?
とkind_of?
は同じメソッドのエイリアスです)が、もっと多くの可能性を見たい場合は、#class
メソッドに注意を向けてください。
A = Class.new
B = Class.new A
a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class