[SCALA] 어떻게 불변 인 Set 비교 방법으로 사용되는 사용자 정의 평등 작업을 정의 할 수 있습니다
SCALA어떻게 불변 인 Set 비교 방법으로 사용되는 사용자 정의 평등 작업을 정의 할 수 있습니다
나는 [MyClass에] 클래스, 설정의 불변의 설정을 가지고, 나는 방법이 교차 설정 및 DIFF을 사용하려면,하지만 난 내 사용자 정의가 아니라 기본 객체 평등 시험보다 방법과 동일하여 평등에 대한 테스트를 원하는
나는 == 연산자를 재정의하는 시도지만 사용되지 않습니다.
미리 감사드립니다.
편집하다:
인터 섹트 방법은 GenSetLike의 구체적인 값 회원입니다
사양 : http://www.scala-lang.org/api/current/scala/collection/GenSetLike.html SRC : https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//library/scala/collection/GenSetLike.scala#L1
def intersect(that: GenSet[A]): Repr = this filter that
그래서 교차 필터 방법을 사용하여 수행된다.
또 다른 편집 :
필터 TraversableLike에 정의 된
사양 : http://www.scala-lang.org/api/current/scala/collection/TraversableLike.html
SRC : https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//library/scala/collection/TraversableLike.scala#L1
def filter(p: A => Boolean): Repr = {
val b = newBuilder
for (x <- this)
if (p(x)) b += x
b.result
}
무엇이 나에게 불분명 것은 술어, P없이 호출 할 때 사용하는 것입니다. 즉 암시 적 매개 변수 아니다.
해결법
-
==============================
1.동일 당신이 그들을 정의하지 않은 경우에만 해시 코드는 경우 클래스에 자동으로 제공됩니다.
동일 당신이 그들을 정의하지 않은 경우에만 해시 코드는 경우 클래스에 자동으로 제공됩니다.
case class MyClass(val name: String) { override def equals(o: Any) = o match { case that: MyClass => that.name.equalsIgnoreCase(this.name) case _ => false } override def hashCode = name.toUpperCase.hashCode } Set(MyClass("xx"), MyClass("XY"), MyClass("xX")) res1: scala.collection.immutable.Set[MyClass] = Set(MyClass(xx), MyClass(XY))
당신이 원하는 것은 참조 평등 경우, 여전히 자동 생성을 방지하기 위해, 등호 및 해시 코드를 작성하고 AnyRef에서 버전을 호출
override def equals(o: Any) = super.equals(o) override def hashCode = super.hashCode
그것으로:
Set(MyClass("x"), MyClass("x")) res2: scala.collection.immutable.Set[MyClass] = Set(MyClass(x), MyClass(x))
항상 밀봉되어 AnyRef에서 등호를 호출하면 (모든 O)는 ==를 재정의 할 수 없습니다. 새 (과부하) == (m : MyClass에)을 정의하려고하는 경우가 여기에 쓸모없고 일반적으로 매우 위험하므로, 그것은 설정 호출 그 아니다.
필터에 대한 호출로서 작동하는 이유는 설정 [A]는 함수 [A, 부울]는 것이다. 그리고 네, 사용되는 동일, 당신은 (SortedSet의 대신 주문을 사용) (적용) 포함에 == 설정 사용의 위해가 포함 동의어, 그리고 대부분의 구현이 함수 구현되어 볼 수 있습니다. 그리고 == 같음을 호출합니다.
참고 : MyClass의 서브 클래스해야하는 경우 내 첫 번째 등호의 구현이 신속하고 더러운 아마도 나쁘다. 그렇다면, 당신이해야 적어도 검사 유형 평등에 (this.getClass == that.getClass) 또는 더 나은 canEqual 방법을 정의 (당신은 다니엘 소브랄로이 블로그를 읽을 수 있습니다)
-
==============================
2.당신은뿐만 아니라 .hashCode를 재정의해야합니다. 이것은 거의 항상 .hashCode 종종 .equals위한 저렴 사전 검사로 사용되는대로, .equals를 오버라이드 (override)의 경우; 동일한 두 개체가 동일한 해쉬 코드를 가져야한다. 나는 당신이 누구의 기본 해시 코드 사용자 정의 평등과 관련하여이 속성을 존중하지 않는 객체를 사용하고 추측하고있어 및 설정 구현 (그래서 결코 심지어 평등 작업 호출) 해시 코드를 기반으로 가정을하고있다.
당신은뿐만 아니라 .hashCode를 재정의해야합니다. 이것은 거의 항상 .hashCode 종종 .equals위한 저렴 사전 검사로 사용되는대로, .equals를 오버라이드 (override)의 경우; 동일한 두 개체가 동일한 해쉬 코드를 가져야한다. 나는 당신이 누구의 기본 해시 코드 사용자 정의 평등과 관련하여이 속성을 존중하지 않는 객체를 사용하고 추측하고있어 및 설정 구현 (그래서 결코 심지어 평등 작업 호출) 해시 코드를 기반으로 가정을하고있다.
Any.equals 및 Any.hashCode에 대한 스칼라 문서를 참조하십시오 : http://www.scala-lang.org/api/rc/scala/Any.html
-
==============================
3.이 답변 쇼 사용자 정의 평등과 정의 변경 가능한 설정을. 이것은 벡터로 내부 저장소를 교체 각 동작시 자체의 수정 카피를 리턴함으로써 이루어질 수 불변
이 답변 쇼 사용자 정의 평등과 정의 변경 가능한 설정을. 이것은 벡터로 내부 저장소를 교체 각 동작시 자체의 수정 카피를 리턴함으로써 이루어질 수 불변
-
==============================
4."이 클래스 어떤에서 마지막 방법으로 정의되어 직접 == 오버라이드 (override) 할 수 없습니다 즉, 스칼라 취급 == 정의 된 것처럼 클래스의 모든 다음과 같이. :
"이 클래스 어떤에서 마지막 방법으로 정의되어 직접 == 오버라이드 (override) 할 수 없습니다 즉, 스칼라 취급 == 정의 된 것처럼 클래스의 모든 다음과 같이. :
final def == (that: Any): Boolean = if (null eq this) {null eq that} else {this equals that}
"프로그래밍에서 스칼라, 두 번째 판에서
from https://stackoverflow.com/questions/7681183/how-can-i-define-a-custom-equality-operation-that-will-be-used-by-immutable-set by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 오른쪽 연관 중위 연산자를 만드는 방법? (0) | 2019.11.21 |
---|---|
[SCALA] 서열에서 만족 조건 X 그 첫 번째 요소를 찾기 (0) | 2019.11.21 |
[SCALA] 효율적으로 스칼라의 문자 / 문자열을 n 번 반복 (0) | 2019.11.21 |
[SCALA] 슬릭 2.0 일반 CRUD 작업 (0) | 2019.11.21 |
[SCALA] 연속 동일한 요소를 그룹화하는 스칼라 목록 기능 (0) | 2019.11.21 |