1 ответ:
мой любимый пример:
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, а ыSet[b1.Coordinate]. Обратите внимание, что можно использовать другой идентификатор с тем же типомb1, так это не идентификаторb1это связано с типом. Например, следующие работы:val b3: b1.type = b1 val c3 = b3.Coordinate(10, 10) b1.occupied += c3
Comments