区别在哪里?我应该使用哪种?为什么有这么多种?
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
,Ruby非常讲究美感。事实上,注意到了语法错误...使用active support 你可以写成 @person.is_an? Administrator
:)...其实这也许已经被加入到Ruby核心部分了。 - rfundukkind_of?
但不能覆盖 is_a?
吗? - Claudiuis_a?
只是kind_of?
的别名。这两个方法调用相同的C函数rb_obj_is_kind_of
。 - ma11hew28kind_of?
而不必重写 is_a?
。 - sepp2kis_an?
方法在哪里?它不在当前的 Rails 版本中,而且我在 Google 上也找不到任何有关它被弃用的信息。请问这个方法去哪儿了? - Tom Lord区别在哪里?
根据文档:
- - (Boolean)
instance_of?(class)
- 如果
obj
是给定类的实例,则返回true
。
和:
- - (Boolean)
is_a?(class)
- (Boolean)kind_of?(class)
- 如果
class
是obj
的类,或者class
是obj
的超类之一或包含在obj
中的模块,则返回true
。
如果这不清楚,最好知道是什么不清楚,以便改进文档。
我应该使用哪个?
从不。改用多态性。
为什么会有这么多?
我不会说两个是“很多”。有两个,因为它们做两件不同的事情。
更符合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
.class
而不是 .instance_of?
? - Ridhwaan Shakeelhttps://dev59.com/a2865IYBdhLWcg3wSMgw#3893305是一个很好的解释...为了更加详细地说明,我倾向于使用is_a?
来判断“原始类型”(String、Array、可能是Hash等)
所以"hello".is_a?(String)
,[].is_a?(Array)
,{}.is_a?(Hash)
对于其他任何东西,我倾向于使用instance_of? (Animal.new.instance_of?(Animal)
我说“倾向于”,因为情况并不是那么明确。例如:
class Animal;end
class Dog < Animal;end
x = Dog.new
x.is_a?(Dog) # => true
x.is_a?(Animal) # => true
x.instance_of?(Dog) # => true
x.instance_of?(Animal) # => false
正如你所看到的,x 同时是 Dog 和 Animal,但它只是 Dog 的一个实例。
我认为这是一个特定性问题:
然后你可以进一步细化。如果我关心它是 Sighthound 而不是 Bloodhound,假设两者都是 Dog 的子类。那么我可能希望更加具体。
话虽如此,is_a?(Animal|Dog|Sighthound) 总是有效的。但如果你关心具体的子类,instance_of? 总是更加具体。
is_a?
和kind_of?
都存在呢?我想这是 Ruby 设计哲学的一部分。Python 会说应该只有一种做法;Ruby 经常有同义词方法,这样你就可以使用听起来更好的那个。这是个人喜好的问题。这可能部分是由于日本的影响:据说他们会根据句子使用不同的字来表示同样的数字,以使其听起来更好听。Matz 可能已经将这个想法带入了他的语言设计中。 - Nathan Long