【问题标题】:`String#===` documentation example`String#===` 文档示例
【发布时间】:2015-01-19 08:50:00
【问题描述】:

字符串类文档(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。但事实并非如此。我在问是否有人可以在示例中显示此描述。我在这里做错了什么?

【问题讨论】:

    标签: ruby string equality


    【解决方案1】:

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

    在您的情况下,foo 响应 #to_str,但不是 String 的实例。所以'some_txt' === foo实际上是在使用Object#===

    大小写平等 – 对于 Object 类,实际上与调用 #== 相同,但通常会被后代覆盖以在 case 语句中提供有意义的语义。

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

    平等 — 在Object 级别,仅当objother相同的对象== 才返回true >。通常,此方法在后代类中被覆盖以提供特定于类的含义。

    根据上述原理——作为String'some_txt'实例,fooFoo的实例,'some_txt' === foo(其实就是foo == 'some_txt',作为@ 987654347@ 将调用委托给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
    

    【讨论】:

    • 你可以实现Foo#== 覆盖Object#==
    • 您的头脑中可能有正确的推理,但您的演示顺序不合逻辑。您想表明在这种情况下,'some_txt' === foo 正在使用 Object#===(而不是 Object#==),然后您想要表明 Object#=== 正在使用 Object#==,除非它被覆盖。
    • 我的误解是我没有看到 Object#=== 是对象而不是字符串的方法.. thx
    • @sawa 现在可以复习了吗?
    • @sawa 感谢您的所有 cmets 使这个答案可读.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2013-03-04
    • 2016-07-17
    • 2010-12-16
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多