Ruby:kind_of?与instance_of?与is_a?

时间:2010-10-08 18:28:12

标签: ruby inheritance introspection

有什么区别?我什么时候应该使用哪个?为什么会有这么多?

4 个答案:

答案 0 :(得分:579)

kind_of?is_a?是同义词。 instance_of?与其他两个不同之处在于,如果对象是该类的实例,而不是子类,则它仅返回true

示例:"hello".is_a? Object"hello".kind_of? Object返回true,因为"hello"StringStringObject的子类。但是"hello".instance_of? Object会返回false

答案 1 :(得分:19)

  

有什么区别?

来自文档:

  
- ( Boolean instance_of?(class)
如果true是给定类的实例,则返回obj。< / DD>

  
- ( Boolean is_a?(class)
- (布尔kind_of?(class)
返回如果trueclass的类,或者objclass的超类或obj中包含的模块之一,则obj。{ / DD>

如果不清楚,那么很高兴知道完全不清楚,以便可以改进文档。

  

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

从不。改为使用多态。

  

为什么会有这么多?

我不会打电话给两个“很多”。有两个,因为他们做了两件不同的事情。

答案 2 :(得分:5)

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

当然并不总是适用,因此仍有可能使用您所询问的方法询问对“类型”(类或基类)的更保守的理解。

答案 3 :(得分:3)

我也不会打两个(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