Answers:
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
。@honda.kind_of? Car
和@person.is_a? Administrator
,红宝石是所有关于美学。实际上,请注意语法错误...在活动支持下,您可以编写@person.is_an? Administrator
:)...实际上,到现在为止,它可能已进入Ruby核心。
kind_of?
但不能is_a?
吗?
kind_of?
而不覆盖is_a?
。
is_an?
方法在哪里?它不是当前的Rails版本,在Google上我也找不到任何有关它已被弃用的信息。
有什么区别?
从文档中:
- -(布尔)
instance_of?(class)
- 返回
true
ifobj
是给定类的实例。
和:
- -(布尔值)
is_a?(class)
-(布尔值)kind_of?(class)
- 返回
true
ifclass
是的类obj
,或者class
是包含的的超类之一obj
或模块之一obj
。
如果不清楚,最好弄清楚到底是什么还不清楚,以便可以改进文档。
我什么时候应该使用哪个?
决不。请改用多态。
为什么会有这么多?
我不会叫两个 “很多”。它们有两个,因为它们做两种不同的事情。
使用,更像Ruby询问对象是否响应您需要的方法respond_to?
。这允许最少的接口和不带意识的编程实现。
当然,它并不总是适用的,因此,仍然有可能使用您要询问的方法来询问对“类型”(类或基类)的更保守的理解。
我也不会调用两个(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
is_a?
和kind_of?
存在:我想这是部分Ruby的设计理念。Python会说应该只有一种方法可以做某事。Ruby通常具有同义方法,因此您可以使用听起来更好的方法。这是一个偏好问题。这可能部分是由于日语的影响:有人告诉我,他们将根据句子对相同的数字使用不同的单词,以使其听起来更好。Matz可能已经将这个想法带入了他的语言设计中。