`String#===`文档示例

时间:2015-01-19 08:50:01

标签: ruby string equality

字符串类文档(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。但它不是。我问一个人是否可以在一个例子中显示这个描述。我在这里做错了什么?

1 个答案:

答案 0 :(得分:4)

  

如果obj不是String的实例但响应to_str,则使用大小写等式Object#===来比较两个字符串。

在您的情况下,foo会回复#to_str,但不回复String的实例。因此'some_txt' === foo实际上正在使用Object#===

  

案例平等 - 对于类Object,实际上与调用#==相同,但通常由后代覆盖,以便在case语句中提供有意义的语义。

FooObject后代类。默认情况下,Ruby中的任何类都从Object继承。现在Foo没有覆盖方法#===,因此根据文档,它将使用Object#==方法。 Object#==的文档说:

  

平等 - 在Object级别,==仅在objother'some_txt'时返回 true 同一个对象。通常,在子类中重写此方法以提供特定于类的含义。

根据上述原则 - String的{​​{1}}实例和fooFoo的实例,'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