Can*_*ide 183

我想你在找instance_of?.is_a?并将kind_of?从派生类的实例返回true.

class X < String
end

foo = X.new

foo.is_a? String         # true
foo.kind_of? String      # true
foo.instance_of? String  # false
foo.instance_of? X       # true
Run Code Online (Sandbox Code Playgroud)

  • 在不知道问题的意图的情况下,我会说对于大多数现实世界的编程情况,`is_a?`实际上是更合适的习惯用法(通常像Andrew Grimm提到的鸭子打字检查更好).严格的类比较通常是代码气味.http://en.wikipedia.org/wiki/Liskov_substitution_principle (9认同)

And*_*imm 26

可以说更多的鸭子打字方法

foo.respond_to?(:to_str)
Run Code Online (Sandbox Code Playgroud)

to_str 表示对象的类可能不是String的实际后代,但是对象本身非常像字符串(stringy?).


Fed*_*les 22

你可以做:

foo.instance_of?(String)
Run Code Online (Sandbox Code Playgroud)

更普遍的是:

foo.kind_of?(String)
Run Code Online (Sandbox Code Playgroud)

  • 什么使`kind_of`更普遍?它们似乎是同义词:[`is_a`](http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.is_a_qm). (3认同)
  • @Davidchambers你是对的,'亲切的?' 是'is_a?'的同义词. (2认同)

Mat*_*hew 6

foo.instance_of? String
Run Code Online (Sandbox Code Playgroud)

要么

foo.kind_of? String 
Run Code Online (Sandbox Code Playgroud)

如果你只关心它是从String它的继承链上的某个地方开始的


ste*_*lag 5

除了其他答案之外,还定义了测试对象是否是该类的实例的Class方法。===

  • o.classo.
  • o.instance_of? c确定是否o.class == c
  • c === o对于类或模块,确定 if o.is_a? c( String === "s"returns true)
  • o.is_a? c是它的o实例c还是它的任何子类?
  • o.kind_of? c同义词is_a?