还有什么比下面这句话更地道的吗?
foo.class == String
kfgdxczn1#
我认为你正在寻找instance_of?。is_a?和kind_of?将返回true的示例从派生类。
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
guicsvcw2#
一个更像鸭子打字的方法是说
foo.respond_to?(:to_str)
to_str表示对象的类可能不是String的实际后代,但对象本身非常类似于String(stringy?)。
to_str
nbewdwxp3#
您可以:
foo.instance_of?(String)
更一般的是:
foo.kind_of?(String)
wkyowqbh4#
foo.instance_of? String
或
foo.kind_of? String
如果您只关心它是否是从String继承链的某个位置派生而来
String
x4shl7ld5#
除了其他答案,Class定义了===方法来测试一个对象是否是该类的示例。
Class
===
o
o.class
o.instance_of? c
o.class == c
c === o
o.is_a? c
String === "s"
true
c
1yjd4xko6#
我认为更好的方法是创建一些 predicate 方法。这也将保存您的“单点控制”。
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
更鸭子打字方式;)
6条答案
按热度按时间kfgdxczn1#
我认为你正在寻找
instance_of?
。is_a?
和kind_of?
将返回true的示例从派生类。guicsvcw2#
一个更像鸭子打字的方法是说
to_str
表示对象的类可能不是String的实际后代,但对象本身非常类似于String(stringy?)。nbewdwxp3#
您可以:
更一般的是:
wkyowqbh4#
或
如果您只关心它是否是从
String
继承链的某个位置派生而来x4shl7ld5#
除了其他答案,
Class
定义了===
方法来测试一个对象是否是该类的示例。o
的o.class
类。o.instance_of? c
确定o.class == c
是否c === o
对于类或模块,确定是否为o.is_a? c
(String === "s"
返回true
)o.is_a? c
o
是c
或它的任何子类的示例吗?is_a?
的同义词1yjd4xko6#
我认为更好的方法是创建一些 predicate 方法。这也将保存您的“单点控制”。
更鸭子打字方式;)