2011-10-13 120 views

回答

149

我认为您正在寻找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 
+6

不知道问题的意图,我认为对于大多数现实世界的编程情况,“is_a?”实际上是更合适的用法(并且经常像安德鲁格林提到的鸭式输入检查更好)。严格的类比较通常是一种代码味道。 HTTP://en.wikipedia。org/wiki/Liskov_substitution_principle – mahemoff

16

你可以这样做:

foo.instance_of?(String) 

而且更普遍的:

foo.kind_of?(String) 
+3

是什么让'kind_of'更普遍?它们似乎是同义词:['is_a'](http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.is_a_qm)。 – davidchambers

+2

@Davidchambers你说得对,'kind_of?'是'is_a?'的同义词。 – steenslag

+0

@davidchambers:你说得对,我的意思是'instance_of?'而不是'is_a?'。 –

6
foo.instance_of? String 

foo.kind_of? String 

如果你O只有关心,如果它是从String derrived从它的继承链的某处

24

更鸭打字的方法是说

foo.respond_to?(:to_str) 

to_str表明一个对象的类可能不是字符串的实际后裔,但对象本身是非常弦(弦?)。

+0

很酷。在这种情况下,我碰巧知道'foo'将会是'true','false'或香草串,但是学习更通用的解决方案是很好的。 – davidchambers

+0

在检查对象是否响应之后,将它与to_s调用结合起来,并且为自己创建了一个字符串! – seanmakesgames

+1

@seanmakesgames你的意思是'to_str'还是'to_s'?两者略有不同。 –

2

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

  • o.class o类。
  • o.instance_of? c确定是否o.class == c
  • o.is_a? c o是c还是它的任何子类的实例?
  • o.kind_of? c * is_a *的同义词*
  • c === o对于类或模块,确定是否* o.is_a? C *(串=== “S”返回true)
0

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

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 

更鸭打字的方式;)

+1

“string”.is_a?(String)'有什么问题?看起来你正在重新发明轮子。还有'class','instance_of','kind_of'等等......不好意思去猴子修补Object类,更不用说它是不必要的。 – Mohamad

+0

我完全同意你的观点:)如果你只关注primitve类型,并且你知道你的项目需求与原始类型相关的将永远不会改变(确定它通常是这种情况;))你很好。但是在需求改变为拥有“单一控制点”的情况下。例如在你的项目环境中,你有很多预先检查(1000以上)。 'pre_check(“test”.is_string?)' 现在你的项目需求会改变,每个包含三个或更多字符的字符串不再被定义为字符串(我知道它的不寻常;)) 现在你可以轻松地改变你自己的方法。 – schlegel11

相关问题