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