복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.이 답변 쇼 사용자 정의 평등과 정의 변경 가능한 설정을. 이것은 벡터로 내부 저장소를 교체 각 동작시 자체의 수정 카피를 리턴함으로써 이루어질 수 불변

    이 답변 쇼 사용자 정의 평등과 정의 변경 가능한 설정을. 이것은 벡터로 내부 저장소를 교체 각 동작시 자체의 수정 카피를 리턴함으로써 이루어질 수 불변

  4. ==============================

    4."이 클래스 어떤에서 마지막 방법으로 정의되어 직접 == 오버라이드 (override) 할 수 없습니다 즉, 스칼라 취급 == 정의 된 것처럼 클래스의 모든 다음과 같이. :

    "이 클래스 어떤에서 마지막 방법으로 정의되어 직접 == 오버라이드 (override) 할 수 없습니다 즉, 스칼라 취급 == 정의 된 것처럼 클래스의 모든 다음과 같이. :

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

    "프로그래밍에서 스칼라, 두 번째 판에서

  5. 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