运算符`!=`使用`==`?

时间:2016-02-29 10:06:47

标签: ruby comparison operator-overloading operators

我定义了一个类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

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

2 个答案:

答案 0 :(得分:7)

除非类层次结构中的任何类已被!=覆盖,否则将调用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#!=的默认行为,只能覆盖== 是安全的。

答案 1 :(得分:-1)

是和否。

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

class X
  def ==(other)
    true
  end

  def !=(other)
    true
  end
end

a = X.new
b = X.new

a == b  #=> true
a != b  #=> true

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