Ruby:kind_of? 与instance_of? 与is_a?

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

4 Solutions collect form web for “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 
  • 我如何find安装gem文件的位置?
  • 你如何在Rails中做相对时间?
  • Ruby的File.open和f.close的需要
  • 铁轨捆绑干净
  • Ruby将一个数组组合成一个string
  • 有没有一种有效的方法来在Ruby中执行数百个文本replace?
  • 如何从两个相同大小的数组中构build一个Ruby哈希?
  • Ruby和JRuby有什么区别?