问题
What is the difference? When should I use which? Why are there so many of them?
回答1:
kind_of? and is_a? are synonymous.
instance_of? is different from the other two in that it only returns true if the object is an instance of that exact class, not a subclass.
Example:
"hello".is_a? Objectand"hello".kind_of? Objectreturntruebecause"hello"is aStringandStringis a subclass ofObject.- However
"hello".instance_of? Objectreturnsfalse.
回答2:
What is the difference?
From the documentation:
- - (Boolean)
instance_of?(class)- Returns
trueifobjis an instance of the given class.
and:
- - (Boolean)
is_a?(class)
- (Boolean)kind_of?(class)- Returns
trueifclassis the class ofobj, or ifclassis one of the superclasses ofobjor modules included inobj.
If that is unclear, it would be nice to know what exactly is unclear, so that the documentation can be improved.
When should I use which?
Never. Use polymorphism instead.
Why are there so many of them?
I wouldn't call two "many". There are two of them, because they do two different things.
回答3:
It is more Ruby-like to ask objects whether they respond to a method you need or not, using respond_to?. This allows both minimal interface and implementation unaware programming.
It is not always applicable of course, thus there is still a possibility to ask about more conservative understanding of "type", which is class or a base class, using the methods you're asking about.
回答4:
I also wouldn't call two many (is_a? and kind_of? are aliases of the same method), but if you want to see more possibilities, turn your attention to #class method:
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
来源:https://stackoverflow.com/questions/3893278/ruby-kind-of-vs-instance-of-vs-is-a