代码之家  ›  专栏  ›  技术社区  ›  illusionist

覆盖==等式运算符仅在一个方向上起作用

  •  0
  • illusionist  · 技术社区  · 7 年前

    考虑下一个例子,其中我覆盖了 == true 不断地:

    class Example
      def ==(other)
        return true
      end
    end
    

    exp = Example.new
    puts exp == {} #=> true
    puts {} == exp #=> false
    

    3 回复  |  直到 7 年前
        1
  •  1
  •   Danil Speransky    7 年前

    不改变其他课程是不可能的。大体上 a == b a.==(b) . 所以你需要覆盖 == 第二节课的操作员,如果你想让它工作的话。

        2
  •  1
  •   Sergio Tulentsev    7 年前

    有没有办法迫使这种等式方法也朝着相反的方向工作?

    Hash#== 识别特殊情况 Example .

    class Example
      def ==(other)
        return true
      end
    end
    
    class Hash
      alias_method :original_double_equals, :==
    
      def ==(other)
        case other
        when Example
          other == self
        else
          original_double_equals(other)
        end
      end
    end
    
    
    exp = Example.new
    exp == {} # => true
    {} == exp # => true
    {} == {} # => true
    {foo: 1} == {foo: 2} # => false
    

    如果我是你,我不会这么做。

        3
  •  1
  •   Jörg W Mittag    7 年前

    不,这是不可能的。

    Ruby是一种面向对象的语言。这个 基本思想 只有接收器 对象决定如何响应该消息。

    • == a b 那么作为一个论点 单独地 决定如何回应。
    • 如果你发送消息 == b ,传递对象 那么作为一个论点 b 决定如何回应。

    这个 唯一的办法 b 同意 给出同样的回答。

    从理论上讲,设计一种语言是有可能的 a == b b 第三 “上下文对象”。换句话说 a==b a.==(b) b.==(a) 而是 some_context_object.==(a, b) self.==(a, b) ). 在这种情况下,上下文对象可以访问 平民的 并可以采取措施确保 ==

    但一般来说,根据面向对象的基本性质,消息是非交换的,接收方对象是特殊的。