Answers:
我想你在找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
String
,而且适用于Integer
和Float
。它也适用Decimal
吗?(崇高的文本解释器以不同的方式突出显示了语法,Decimal
这使我感到怀疑)
一种更鸭蛋的方法是说
foo.respond_to?(:to_str)
to_str
指示对象的类可能不是String的实际后代,但对象本身非常像字符串(stringy?)。
foo
要么是true
,false
或香草字符串,但它是很好的学习更广泛的解决方案。
to_str
还是to_s
?两者略有不同。
你可以做:
foo.instance_of?(String)
更一般的:
foo.kind_of?(String)
kind_of
更普遍?它们似乎是同义词:is_a
。
instance_of?
不是is_a?
。
我认为更好的方法是创建一些谓词方法。这还将保存您的“单一控制点”。
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
类,更何况这是不必要的。
pre_check("test".is_string?)
现在您的项目需求将发生变化,并且三个或三个以上字符的每个String都不再定义为String(我知道这很不寻常;)。现在,您可以轻松更改自己的方法。
is_a?
实际上是更适合使用的习惯用法(通常,像Andrew Grimm提到的那种鸭嘴式检查甚至更好)。严格的类比较通常是代码味道。en.wikipedia.org/wiki/Liskov_substitution_principle