2012-03-24 1 views
7

프로그래밍에서 스칼라를 읽는 중입니다. 그것은 말한다 :스칼라 : == 기본값은 같습니까?

당신은 항상 클래스 Any로부터 상속 된 equals 방법을 재정 의하여 새로운 유형의 ==의 동작을 다시 정의 할 수 있습니다. 상속 된 equals은 Java에서와 같이 재정의 (override)되지 않는 한 객체 식별자로 적용됩니다. 그래서 equals (그리고 그걸 가지고, ==)은 기본적으로 eq과 같지만 정의한 클래스에서 equals 메서드를 재정 의하여 동작을 변경할 수 있습니다. Any의 최종 메서드로 정의되어 있으므로 ==을 직접 재정의 할 수 없습니다. 즉 스칼라 == 취급,있는 그대로 클래스 Any에 다음과 같이 정의 된 경우 :

final def == (that: Any): Boolean = 
    if (null eq this) (null eq that) else (this equals that) 

을하지만 내가 그것을 것 같다 스칼라 2.9.1에서보고 있어요 것과 jibing되지 않습니다

  • ==
      내가 (컴파일러에서 불만없이 필요하지 override)를 직접 ==을 무시할 수 없다
    • equals에 기본하지 않는 것 같습니다.

    그래서 같은 하나 나에게 보인다 내가 잘못을하고 있어요

    • -this definition of Rational

      % scala                 
      Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). 
      Type in expressions to have them evaluated. 
      Type :help for more information. 
      
      scala> Rational(1) == Rational(1) 
      res0: Boolean = false 
      
      scala> Rational(1) equals Rational(1) 
      res1: Boolean = true 
      
    • 를 제공하거나 내가의 최신 버전의 아웃 읽고 있어요 책 및 사물이 변경되었습니다.

    무슨 일 이니?

  • 답변

    21

    매우 이해할 수없는 실수입니다. 일반 같음 (즉, override def equals(a: Any)) 대신 형식 안전 같음 (즉, def equals(r: Rational))을 쓰려고합니다. 당신이 override 키워드가 필요하지 않습니다 그래서 그 대신 최우선 equals --note의

    은! - 당신은 유형 매개 변수를 오버로드하여 다른 방법을 작성하고, equals 메소드를 소요 한 Rational 하나를 가지고 소요 시간은 Any입니다. ==과 동일합니다. Any -parameterized 메서드 만 재정의 할 수 없습니다.

    은 굉장

    override def equals(a: Any) = a match { 
        case r: Rational => numer == r.numer && denom == r.demon 
        case _ => false 
    } 
    
    +0

    같은 무언가로 자바 (그리고 스칼라 라이브러리)과 일치하는 행동, 당신은 다시 작성해야 할 것 같습니다를 얻으려면. JVM으로 돌아올 때마다이 물기가 내게 들립니다. 나는 그것을 조만간 배울 것이다. 어쨌든'a match '를 삭제하고 익명 함수로'equals '를 할당 할 수 있습니까? 'override def equals : Any => 부울 = {case r : Rational/* ... * /}'는 효과가 없습니다 ... – rampion

    +2

    @rampion - 아니요, 형식 서명을 정확히 일치시켜야합니다. 'equals : Any => Boolean '은 함수 (즉, Function1 [Any, Boolean] 클래스의 인스턴스)를 반환한다는 것을 의미합니다. 개념적으로는 같은 의미이지만, 정확히 같은 방법이 아니므로 작동하지 않습니다. –