Scala的path依赖types是什么意思?

我听说斯卡拉有path依赖types。 这是与内部类的事情,但这实际上是什么意思,为什么我关心?

我最喜欢的例子:

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的types取决于实例化的Board实例。 有很多事情可以用这个来实现,给出一种依赖于价值而不是单独types的types安全。

这可能听起来像依赖types,但它是更有限的。 例如, occupied的types取决于Board的值。 在上面,最后一行不起作用,因为c2的types是b2.Coordinate ,而occupied的types是Set[b1.Coordinate] 。 请注意,可以使用具有相同types的b1另一个标识符,因此它不是与该types关联的标识符 b1 。 例如,以下工作:

 val b3: b1.type = b1 val c3 = b3.Coordinate(10, 10) b1.occupied += c3