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"
是一个String
而String
是Object
一个子类。 但是"hello".instance_of? Object
"hello".instance_of? Object
返回false
。
有什么不同?
从文档:
- – ( 布尔 )
instance_of?(class)
- 如果
obj
是给定类的实例,则返回true
。
和:
- – ( 布尔型 )
is_a?(class)
– ( 布尔 )kind_of?(class)
- 如果
class
是obj
的类,或者如果class
是包含在obj
的obj
或模块的超类之一,则返回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