2012-06-28 4 views
4

나는 eql?와 루비의 ==의 차이점에 대해 읽어 봤는데, 나는 eql?는 루비 문서에 따르면 가치와 유형ruby ​​typical eql? 및 == 구현

을 비교하면서 ==이 값을 비교 이해 :

Object 클래스의 객체의 경우? ==와 동의어입니다. 서브 클래스는 일반적으로이 전통을 계속하지만 예외가 있습니다.

문서에 지정된 동작이 자동으로 상속되는 것처럼 보이지 않지만 이러한 방법을 구현하는 방법에 대한 제안 일뿐입니다. 또한 == 또는 eql? 중 하나를 재정의하는 경우 두 가지를 모두 재정의해야 함을 의미합니까? 아래의 클래스 Person에서

,이 eql?==을 overridding의 전형적인 방법입니다 곳으로 덜 제한 == 위양 더 제한적인 eql? ( == 만에 구현 된 경우가 ==- eql? 대표가 거꾸로 보인다 값이 아닌 유형을 비교).

class Person 

    def initialize(name) 
    @name = name 
    end 

    def eql?(other) 
    other.instance_of?(self.class) && @name == other.name 
    end 

    def ==(other) 
    self.eql?(other) 
    end 

protected 
    attr_reader :name 

end 

답변

4

나는 지금 혼란스러워하며 어떤 문서가 의미합니까? aliasing eql? == 메소드는 다음과 같이 구현됩니다 :

그렇다면 ==를 재정의하면 eql에 영향을주지 않는 이유는 무엇입니까? 비록 그들이 '동의어'라고하더라도. 따라서 귀하의 경우 다음과 같아야합니다 :

class Person 
    #... 
    def ==(other) 
    other.instance_of?(self.class) && @name == other.name 
    end 
    alias_method :eql?, :== 
    #... 
end 
+0

동일하지 않습니까? 재정의해서는 안되니? 이 문서는 Numeric이 == 및 eql을 구현하는 방법에 대한 구체적인 예를 제공합니다. 다르게 –

+0

당신 맞습니까? 덮어 써서는 안되는 것입니다. 나는 나의 대답을 업데이트했다. –

+0

@Vincent, if == 및 eql? 동의어이기 때문에 우선 순위를 우선하는 것이 둘 다 같은 행동을 일으킬 것이라고 생각합니다. 나는 eql을 재정의하려고 시도 했는가? 그리고 ==, 그리고 난 ==하지 eql을 무시하려고했는데?, 그리고 행동은 동일하지 않습니다, 그래서 나는 그들이 동의어 문서에 의해 혼란스러워. –