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