还有比以下更惯用的东西吗?
foo.class == String
答案 0 :(得分:172)
我认为您正在寻找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
答案 1 :(得分:24)
更多的鸭子打字方法就是说
foo.respond_to?(:to_str)
to_str
表示对象的类可能不是String的实际后代,但是对象本身非常像字符串(stringy?)。
答案 2 :(得分:20)
你可以这样做:
foo.instance_of?(String)
更普遍:
foo.kind_of?(String)
答案 3 :(得分:6)
foo.instance_of? String
或
foo.kind_of? String
如果您只关心它是否来自String
其继承链上的某个地方
答案 4 :(得分:3)
除了其他答案之外,Class定义方法===来测试对象是否是该类的实例。
答案 5 :(得分:-1)
我认为更好的方法是创建一些谓词方法。 这也将保存您的“单点控制”。
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
鸭子打字方式越多;)