다음이 예외없이 실행되는 이유는 무엇입니까?
import scala.collection.mutable
class Label(val name: String) {
override def toString = s"Label($name)"
}
object Main extends App {
var map = mutable.Map[Label, Int]()
val ab = new Label("AB")
map += ab -> 1
println(map(ab))
}
다음은 다음을 생성합니다 NoSuchElementException
.
import scala.collection.mutable
class Label(val name: String) {
override def toString = s"Label($name)"
}
object Main extends App {
var map = mutable.Map[Label, Int]()
map += new Label("AB") -> 1
println(map(new Label("AB")))
}
나는 이것에 대한 해결책을 찾을 수 없었지만 그것이 Scala의 평등과 정체성의 차이와 관련이 있다고 믿습니다.
Scala의 평등과 동일성은 Java와 같습니다. 기본적으로 두 개체는 동일한 경우에만 동일합니다. 클래스는 오버라이드 (override) 할 필요가 equals
및 hashCode
두 가지 객체가 해시 데이터 동등하게 처리 할 수 있도록한다. 기본적으로 이러한 메서드가 재정의되지 않으면 두 개체가 "같지"않고 해시 키로 대체되지 않습니다.
Java와 Scala의 주요 차이점은 ==
연산자가 동등성을 테스트한다는 것입니다. 즉 equals
, Java에서는 ==
ID를 테스트 하는 동안 메서드를 사용합니다 . (Scala에서 ID를 테스트하려면 eq
연산자를 사용하십시오 .)
따라서 두 번째 코드 스 니펫에서 각 평가 new Label("AB")
는 고유하고 동등하지 않은 객체 를 생성합니다. 두 번째 평가의 결과를 살펴보면 첫 번째 평가로 해결할 수 없습니다.
자바보다 훨씬 더 많은 스칼라 그러나, 일반적인 관행은 재정을 불변의 객체를 정의하는 것입니다 equals
및 hashCode
. Scala는 "케이스 클래스"라는 개념을 제공하는데, 이는 다른 편의 중에서도 이러한 메서드를 자동으로 재정의합니다.
에 case
대한 클래스 정의 앞에 단어 를 넣어 두 번째 코드 조각을 수정할 수 있습니다 Label
.
scala> import scala.collection.mutable
import scala.collection.mutable
scala> case class Label(val name: String) {
| override def toString = s"Label($name)"
| }
defined class Label
scala> object Main extends App {
| var map = mutable.Map[Label, Int]()
| map += new Label("AB") -> 1
| println(map(new Label("AB")))
| }
defined object Main
scala> Main.main(Array.empty[String])
1
케이스 클래스는 클래스에 대한 동반 객체와 apply
기본 생성자를 호출 하는 메소드도 자동으로 정의합니다 . 따라서 글을 쓰는 것보다 new Label("AB")
단순히 글을 쓰는 것이 더 관습적일 것 Label("AB")
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다