2016-02-29 123 views
1

我定義的類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 

的是否使用!===默認的實現?我是否也需要重寫!=

+1

_Sidenote_:'=='是**不是運算符**,它是一個在[在這個特殊情況下]'用戶'類中定義的方法。 – mudasobwa

+0

@mudasobwa其實它既是。 'def =='定義了一個*方法*,當使用'=='*運算符*時被調用。 – Stefan

+0

@斯特凡恩,是的;我的意思是OP中提到的是一種方法,而不是操作員。 – mudasobwa

回答

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

是的,沒有。

==!=都是方法,因此您可以隨時重寫它們。

class X 
    def ==(other) 
    true 
    end 

    def !=(other) 
    true 
    end 
end 

a = X.new 
b = X.new 

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

默認情況下,!=使用==

+1

OP聲明**默認**'!='。答案中的「否」部分和你的整個例子與問題無關。當這些部分被刪除時,答案就不會比早些時候回答的mudasobwa更具信息量。 – sawa