[scala] Scala의 경로 종속 유형은 무엇을 의미합니까?

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


답변