检查一个variables是否是Ruby中的一个string

还有什么比以下更习惯吗?

foo.class == String 

我想你正在寻找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 

更多的鸭子打字的方法就是说

 foo.respond_to?(:to_str) 

to_str表示对象的类可能不是string的实际后代,但对象本身非常类似string(stringy?)。

你可以做:

 foo.instance_of?(String) 

而更一般的:

 foo.kind_of?(String) 
 foo.instance_of? String 

要么

 foo.kind_of? String 

如果你只关心它是否从String某处inheritance它的inheritance链

除了其他的答案之外,Class定义了方法===来testing一个对象是否是该类的一个实例。

  • o.class类的o。
  • o.instance_of? c决定是否o.class == c
  • o.is_a? cc的一个实例还是它的任何子类的实例?
  • o.kind_of? c是* is_a的同义词?
  • c === o为类或模块,确定是否* o.is_a? c *( String ===“s”返回true)

我认为更好的方法是创build一些谓词方法。 这也将节省您的“单点控制”。

 class Object def is_string? false end end class String def is_string? true end end print "test".is_string? #=> true print 1.is_string? #=> false 

更多的鸭子打字方式;)