还有什么比以下更惯用的吗?
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
表示对象的类可能不是字符串的实际后代,但对象本身非常类似于字符串(字符串?)。
foo
将是 true
、false
或普通字符串,但学习更多通用解决方案是件好事。
to_str
还是to_s
?两者略有不同。
你可以做:
foo.instance_of?(String)
更一般的:
foo.kind_of?(String)
kind_of
更通用?它们似乎是同义词:is_a
。
instance_of?
而不是 is_a?
。
foo.instance_of? String
或者
foo.kind_of? String
如果您只关心它是否从 String
派生自其继承链的某个位置
除了其他答案之外,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* (String === "s" 返回真)
我认为更好的方法是创建一些谓词方法。这也将保存您的“单点控制”。
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?)
现在您的项目需求将发生变化,每个包含三个或更多字符的字符串不再定义为字符串(我知道它不寻常;))现在您可以轻松更改自己的方法。
不定期副业成功案例分享
is_a?
实际上是更合适的习惯用法(通常像 Andrew Grimm 提到的鸭式检查甚至更好)。严格的类比较通常是代码异味。 en.wikipedia.org/wiki/Liskov_substitution_principleString
,而且适用于Integer
和Float
。它也适用于Decimal
吗? (崇高的文本解释器以不同的方式突出显示Decimal
的语法,这让我很怀疑)