还有什么比下面这些更加地道的吗?
foo.class == String
你可以这样做:
foo.instance_of?(String)
更一般的说法是:
foo.kind_of?(String)
foo.instance_of? String
或者
foo.kind_of? String
如果你只关心它是否是从 String继承链上的某个地方派生出来的
String
我认为你正在寻找 instance_of?.is_a?和 kind_of?将返回真从派生类的实例。
instance_of?
is_a?
kind_of?
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表示对象的类可能不是 String 的实际后代,但是对象本身非常类似于字符串(stringy?).
to_str
除了其他答案之外,Class 还定义了 method = = = 来测试一个对象是否是该类的实例。
我认为更好的方法是创建一些谓词方法。 这也将保存您的“单点控制”。
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
鸭子打字方式越多;)