回答
我认为您正在寻找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.instance_of?(String)
而且更普遍的:
foo.kind_of?(String)
是什么让'kind_of'更普遍?它们似乎是同义词:['is_a'](http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.is_a_qm)。 – davidchambers
@Davidchambers你说得对,'kind_of?'是'is_a?'的同义词。 – steenslag
@davidchambers:你说得对,我的意思是'instance_of?'而不是'is_a?'。 –
foo.instance_of? String
或
foo.kind_of? String
如果你O只有关心,如果它是从String
derrived从它的继承链的某处
更鸭打字的方法是说
foo.respond_to?(:to_str)
to_str
表明一个对象的类可能不是字符串的实际后裔,但对象本身是非常弦(弦?)。
很酷。在这种情况下,我碰巧知道'foo'将会是'true','false'或香草串,但是学习更通用的解决方案是很好的。 – davidchambers
在检查对象是否响应之后,将它与to_s调用结合起来,并且为自己创建了一个字符串! – seanmakesgames
@seanmakesgames你的意思是'to_str'还是'to_s'?两者略有不同。 –
除了其他答案,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)
我认为更好的办法是创建一些谓词的方法。 这也将节省您的“单点控制”。
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
更鸭打字的方式;)
“string”.is_a?(String)'有什么问题?看起来你正在重新发明轮子。还有'class','instance_of','kind_of'等等......不好意思去猴子修补Object类,更不用说它是不必要的。 – Mohamad
我完全同意你的观点:)如果你只关注primitve类型,并且你知道你的项目需求与原始类型相关的将永远不会改变(确定它通常是这种情况;))你很好。但是在需求改变为拥有“单一控制点”的情况下。例如在你的项目环境中,你有很多预先检查(1000以上)。 'pre_check(“test”.is_string?)' 现在你的项目需求会改变,每个包含三个或更多字符的字符串不再被定义为字符串(我知道它的不寻常;)) 现在你可以轻松地改变你自己的方法。 – schlegel11
- 1. 检查一个变量是否是一个CSV字符串中的值
- 2. 检查字符串变量是否为某个字符串值
- 3. Python:检查一个变量是否是一个字典
- 4. 如何检查一个对象是否是一个字符串?
- 5. 是否有一个ruby库来检查一个字符串是否是一个有效的单词?
- 6. 检查一个变量是一个unicode字符串的列表还是只有一个unicode字符串
- 7. 检查一个字符串是否是JavaScript中的html字体
- 8. 检查一个值是否在一个字符串中
- 9. C - 检查字符串是否是另一个字符串的子字符串
- 10. 检查变量是否是VTL中的一个数字
- 11. 检查输入是否是一个循环中的字符串
- 12. 如何检查一个ruby字符串是一个实际的字符串还是一个blob数据如image
- 13. 检查一个字符串是一个字符串模式
- 14. 爪哇 - 检查是否字符串在另一个字符串
- 15. Applescript:检查一个字符串是否包含空字符串?
- 16. 检查一个字符串是否包含一个int
- 17. 检查一个nsstring是否与另一个字符串匹配
- 18. 检查一个列表是否包含一个字符串
- 19. 检查是否字符串仿佛是另一个Rails中
- 20. 如何使用Regex检查字符串变量中是否存在一个字符串变量?
- 21. 检查一个字符串是否是一个有效的数字:ArrayIndexOutOfBoundsException异常
- 22. 检查一个字符串是否是回文不是
- 23. 检查一个字符串是否与另一个字符串相似
- 24. 如何检查一个字符串是否包含一个子字符串 - mysql
- 25. 有效检查一个字符串是否包含另一个字符串
- 26. 如何检查一个字符串是否等于另一个字符串?
- 27. 检查一个字符串是否包含另一个字符串
- 28. 如何检查一个字符串是否是纯字母?
- 29. 检查C++中是否只有一个字符串变量不为nullptr
- 30. 检查一个字符串是否不包含一些文字
不知道问题的意图,我认为对于大多数现实世界的编程情况,“is_a?”实际上是更合适的用法(并且经常像安德鲁格林提到的鸭式输入检查更好)。严格的类比较通常是一种代码味道。 HTTP://en.wikipedia。org/wiki/Liskov_substitution_principle – mahemoff