字符串类文档(2.1.1)将===
运算符描述为:
如果
obj
不是String
的实例但响应to_str
,则使用大小写相等Object#===
比较两个字符串。
我在一个例子中试过这个,但它没有用。以下是我尝试的方法:
class Foo
def to_str
'some_txt'
end
end
foo = Foo.new
'some_txt' === foo #=> false
我希望这应该返回true
。但它不是。我问一个人是否可以在一个例子中显示这个描述。我在这里做错了什么?
答案 0 :(得分:4)
如果obj不是String的实例但响应to_str,则使用大小写等式Object#===来比较两个字符串。
在您的情况下,foo
会回复#to_str
,但不回复String
的实例。因此'some_txt' === foo
实际上正在使用Object#===
案例平等 - 对于类
Object
,实际上与调用#==
相同,但通常由后代覆盖,以便在case语句中提供有意义的语义。
Foo
是Object
的后代类。默认情况下,Ruby中的任何类都从Object
继承。现在Foo
没有覆盖方法#===
,因此根据文档,它将使用Object#==
方法。 Object#==
的文档说:
平等 - 在
Object
级别,==
仅在obj
和other
为'some_txt'
时返回 true 同一个对象。通常,在子类中重写此方法以提供特定于类的含义。
根据上述原则 - String
的{{1}}实例和foo
是Foo
的实例,'some_txt' === foo
(实际为foo == 'some_txt'
,Object#===
委托对Object#==
的调用)正在提供false
。
Object#==
和Object#===
的文档都说 -
通常,在子类中重写此方法以提供特定于类的含义。
这意味着您可以覆盖Object#===
或Object#==
来实现您的比较逻辑。为了模拟我刚才所说的内容,我假设一个虚拟示例代码: -
class Foo
def to_str
'some_txt'
end
def ==(other)
true
end
end
foo = Foo.new
'some_txt' === foo # => true
foo.class.superclass # => Object