Ruby:kind_of? 与instance_of? 与is_a?

有什么不同? 我应该什么时候使用哪个? 为什么有这么多呢?

kind_of?is_a? 是同义词。 instance_of? 与其他两个不同的是,如果对象是一个确切类的实例,而不是子类,则它只返回true

例如: "hello".is_a? Object "hello".is_a? Object"hello".kind_of? Object "hello".kind_of? Object返回true因为"hello"是一个StringStringObject一个子类。 但是"hello".instance_of? Object "hello".instance_of? Object返回false

有什么不同?

从文档:

– ( 布尔instance_of?(class)
如果obj是给定类的实例,则返回true

和:

– ( 布尔型is_a?(class)
– ( 布尔kind_of?(class)
如果classobj的类,或者如果class是包含在objobj或模块的超类之一,则返回true

如果不清楚的话,很高兴知道究竟有什么不清楚的地方,以便提高文件的质量。

我应该什么时候使用哪个?

决不。 改用多态性。

为什么有这么多呢?

我不会叫两个 “多”。 有两个,因为他们做了两件不同的事情。

使用respond_to?来询问对象是否响应您需要或不需要的方法更像Ruby respond_to? 。 这允许最小的接口和实现不知道编程。

当然这并不总是适用的,因此仍然有可能使用你所提出的方法来询问更“保守”的“types”,即类或基类。

我也不会调用两个很多( 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