2012-09-28 1 views
3

은 89 페이지의 5.7 절은 "=="연산자는 다음과 같이 설명 : 보시다시피, ==주의 깊게 있도록 제작 된 "스칼라에서 nulls의 동등성, odersky 책의 설명이 스칼라 코드와 다른 것처럼 보입니까? 두 번째 버전 "스칼라 프로그래밍의"Odersky 책에서

당신 가장 간단한 규칙으로 수행됩니다 : 먼저 왼쪽에 null이 있는지 확인하고 null이 아닌 경우 equals 메서드를 호출합니다 ... 자동 null 검사가 있으므로, 당신은 (7) "

그런 다음 주"7 "를 자신을 점검 할 필요가 없습니다 :

"자동 검사는 오른쪽을 보지 않지만 인수가 널이면 합리적인 모든 equals 메소드가 false를 반환해야합니다."

null 체크가 RHS를 보지 않는다면, 나는 항상 false로 평가하기 위해 null == 아무 것도 기대하지 않았지만, 시도해 보았고 null == null은 true로 평가됩니다.

이 책은 scala 2.8을 기반으로합니다. 어떤 시점에서 언어가 변경 되었습니까, 아니면 설명을 이해하지 못 했습니까?

내가 사용한 drools 엔진에서 ==는 LHS가 null이고 RHS가 null이 아닌 경우 RHS의 equals 메서드가 LHS를 통과한다는 식으로 해석되었습니다. 가장 합리적인 equals 메서드가 null에 대해 false를 반환해야하지만, drools 엔진이이 문제를 처리하는 방식이 마음에 들었습니다. SQL에서는 null을 사용했습니다! = null.

답변

2

인용 된 텍스트는 LHS가 null이 아닌 경우에만 발생하므로 그 부분에는 모순이없는 것으로 보입니다. LHS가 null 일 때 일어나는 일에 대한 설명은 아마도 인용하지 않은 텍스트의 일부 또는 전체적으로 누락 된 것일 수 있습니다.

참고 (7)은 LHS가 null이 아닌 경우 RHS에 대한 검사가 수행되지 않고 RHS가 equals으로 전달됨을 설명합니다. 따라서 someExpression == null과 같은 것을 비교할 때, Scala는 먼저 someExpression이 null이 아니고 someExpression.equals(null)을 호출하는지 검사합니다.

내가 스칼라의 term1 == term2 자바의

(term1 != null) ? term1.equals(term2) : (term2 == null) 

로 변환되는 것을 말할 것

이 (이것은 자바 위의 줄을 너무 == 니펫을 유의 자바의 참조 평등을 의미한다.)

2

이유는 다음과 같습니다. == is implemented in AnyRef. 스 니핏의 세번째 라인에서 모두 eq null 검사 참을 리턴이 경우 null == null 너무

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

eq

는 두 변수가 동일한 객체를 참조하는 경우를 확인하는 방법이다.