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