2012-08-09 2 views
7

스칼라의 == 메서드는 Java의 equals 메서드와 동일한 의미를가집니다. 그러나 재귀 구조의 인스턴스에 적용 할 때 이해하고 싶습니다. 나는 BinaryExp의 두 인스턴스가있을 때 obj1obj2이 깊은 (재귀) 평등 테스트에 obj1 == obj2 결과를하지 말, 그리고재귀 적으로 정의 된 유형의 스칼라 및 == 메서드

abstract class Exp 

abstract class BinaryExp(l:Exp, r:Exp) extends Exp 

case class Plus(l:Exp, r:Exp) extends BinaryExp(l,r) 

case class Minus(l:Exp, r:Exp) extends BinaryExp(l,r) 

case class Mult(l:Exp, r:Exp) extends BinaryExp(l,r) 

case class Div(l:Exp, r:Exp) extends BinaryExp(l,r) 

case class Num(v:Int) extends Exp 

: 예를 들어, 표현의 무리를 고려? 즉, obj1 == obj2이 성립한다면, obj1obj2은 똑같은 표현식 트리를 나타내는 것입니까?

모든 클래스에서 기본 구현 인 ==에 의존합니다 (어느 곳에서도 대체되지 않음).

답변

14

이 자신을 테스트하기 쉬운 :

val x = Plus(Num(1), Num(2)) 
val y = Plus(Num(1), Num(2)) 
val z = Plus(Num(1), Num(3)) 

println(x == y) // prints true 
println(x == z) // prints false 

이 올바른 답을주고 있다는 사실은 동등 검사는 표현식의 "깊은"평등 확인되는 것을 보여줍니다.이

"구조 평등"의 종류 구조 평등을 구현

스칼라 컴파일러가 생성하는 모든 경우에 클래스에 대한

이 동일 방법 :

또한, 당신은 documentation 것을 볼 수 당신이 궁금해하는 깊은 평등 검사.

마지막으로 구문 설탕에서 어떤 일이 일어나고 있는지 실제로보고 싶다면 을 사용하거나 scalac을 실행하거나 REPL을 시작할 때 옵션을 사용할 수 있습니다. 첫 번째 case에 묻혀, 그래서

scala> case class Plus(l:Exp, r:Exp) extends BinaryExp(l,r) 
[[syntax trees at end of typer]]// Scala source: <console> 
... 
case class Plus extends $line2.$read.$iw.$iw.BinaryExp with ScalaObject with Product with Serializable { 
    ... 
    override def equals(x$1: Any): Boolean = Plus.this.eq(x$1.asInstanceOf[java.lang.Object]).||(x$1 match { 
    case (l: $line1.$read.$iw.$iw.Exp, r: $line1.$read.$iw.$iw.Exp)$line3.$read.$iw.$iw.Plus((l$1 @ _), (r$1 @ _)) if l$1.==(l).&&(r$1.==(r)) => x$1.asInstanceOf[$line3.$read.$iw.$iw.Plus].canEqual(Plus.this) 
    case _ => false 
    }); 

당신은 Plus.equals 확인하기 위해 if l$1.==(l).&&(r$1.==(r))를 호출하는 것을 볼 수 있습니다 : 당신이 REPL에 해당 옵션을 사용하고 클래스 Plus를 선언하면, 여기에 당신이 (단축) 무엇을 얻을 평등. 즉, 사례 클래스의 생성 된 동등성 메소드는 하위 표현식에 ==을 호출하여 동등성을 확인합니다.

관련 문제