【问题标题】:Does the operator `!=` use `==`?运算符 `!=` 是否使用 `==`?
【发布时间】:2016-02-29 10:06:46
【问题描述】:

我定义了一个类User,并像这样覆盖了它的== 运算符:

class User
  attr_reader :age

  def initialize age
    @age = age
  end

  def ==(other_user)
    return true if @age == other_user.age
    false
  end
end

!= 的默认实现是否使用==?我也不需要覆盖!= 吗?

【问题讨论】:

  • 旁注== 不是运算符,它是一种方法,定义在 [在这种特殊情况下] User 类.
  • @mudasobwa 事实上两者都是。 def == 定义了一个方法,在使用== 操作符时调用。
  • @Stefan 好吧,是的;我的意思是 OP 中提到的是一种方法,而不是运算符。
  • Comparable module 为您提供<, <=, ==, >=, >between? 方法以换取<=> 方法。 (def <=>(other); @age <=> other.age; end)

标签: ruby comparison operator-overloading operators


【解决方案1】:

除非类层次结构中的任何类都覆盖了!=,否则将调用BasicObject#!= 上的默认实现。

如果你在我链接的页面上点击“点击切换源”,你会看到默认实现

 VALUE
rb_obj_not_equal(VALUE obj1, VALUE obj2)
{
    VALUE result = rb_funcall(obj1, id_eq, 1, obj2);
    return RTEST(result) ? Qfalse : Qtrue;
}

只需调用== 并否定返回值。

也就是说,虽然您确定,您的类的任何祖先都不会覆盖 BasicObject#!= 的默认行为,但仅覆盖 == 是安全的

【讨论】:

    【解决方案2】:

    是和不是。

    ==!= 都是方法,因此您可以随时单独覆盖它们。

    class X
      def ==(other)
        true
      end
    
      def !=(other)
        true
      end
    end
    
    a = X.new
    b = X.new
    
    a == b  #=> true
    a != b  #=> true
    

    默认情况下,!= 使用 ==

    【讨论】:

    • OP 声明了默认 !=。您答案的“否”部分和您的整个示例与问题无关。当这些部分被删除时,答案并不比之前回答过的 mudasobwa 提供的更多信息。
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 2011-05-04
    • 2015-07-16
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2019-10-08
    相关资源
    最近更新 更多