Scala에는 경로 종속 유형이 있다고 들었습니다. 내부 클래스와 관련이 있지만 이것이 실제로 무엇을 의미하며 왜 내가 관심을 갖는가?
답변
내가 가장 좋아하는 예 :
case class Board(length: Int, height: Int) {
case class Coordinate(x: Int, y: Int) {
require(0 <= x && x < length && 0 <= y && y < height)
}
val occupied = scala.collection.mutable.Set[Coordinate]()
}
val b1 = Board(20, 20)
val b2 = Board(30, 30)
val c1 = b1.Coordinate(15, 15)
val c2 = b2.Coordinate(25, 25)
b1.occupied += c1
b2.occupied += c2
// Next line doesn't compile
b1.occupied += c2
따라서 유형 은 인스턴스화 된 Coordinate
인스턴스에 따라 다릅니다 Board
. 이것으로 달성 할 수있는 모든 종류의 일들이 있으며, 유형 단독이 아닌 값에 의존하는 일종의 유형 안전성을 제공합니다.
이것은 종속 유형처럼 들릴 수 있지만 더 제한적입니다. 예를 들어의 유형은 occupied
의 값에 따라 다릅니다 Board
. 의 유형이 있기 때문에 위, 마지막 줄이없는 작업을 수행 c2
입니다 b2.Coordinate
동안 occupied
의 유형입니다 Set[b1.Coordinate]
. 동일한 유형의 다른 식별자를 사용할 수 있으므로 유형 과 관련된 식별자b1
가 아닙니다 . 예를 들어 다음과 같이 작동합니다. b1
val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3