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)- 返回
trueifobj是给定类的实例。
和:
- -(布尔值)
is_a?(class)
-(布尔值)kind_of?(class)- 返回
trueifclass是的类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可能已经将这个想法带入了他的语言设计中。