有什么区别?我什么时候应该使用哪个?为什么会有这么多?
答案 0 :(得分:579)
kind_of?
和is_a?
是同义词。 instance_of?
与其他两个不同之处在于,如果对象是该类的实例,而不是子类,则它仅返回true
。
示例:"hello".is_a? Object
和"hello".kind_of? Object
返回true
,因为"hello"
是String
而String
是Object
的子类。但是"hello".instance_of? Object
会返回false
。
答案 1 :(得分:19)
有什么区别?
来自文档:
- - ( Boolean )
instance_of?(class)
- 如果
true
是给定类的实例,则返回obj
。< / DD>
和
- - ( Boolean )
is_a?(class)
- (布尔)kind_of?(class)
- 返回如果
true
是class
的类,或者obj
是class
的超类或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