我定义了一个类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
!=
的默认实施是否使用==
?我是否也不需要覆盖!=
?
答案 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
默认情况下,!=
使用==
。