Tôi đã nghe nói rằng Scala có các loại phụ thuộc vào đường dẫn. Đó là một cái gì đó để làm với các lớp bên trong nhưng điều này thực sự có ý nghĩa gì và tại sao tôi quan tâm?
Tôi đã nghe nói rằng Scala có các loại phụ thuộc vào đường dẫn. Đó là một cái gì đó để làm với các lớp bên trong nhưng điều này thực sự có ý nghĩa gì và tại sao tôi quan tâm?
Câu trả lời:
Ví dụ yêu thích của tôi:
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
Vì vậy, loại Coordinate
phụ thuộc vào thể Board
hiện mà nó được khởi tạo. Có tất cả các loại điều có thể được thực hiện với điều này, đưa ra một loại an toàn loại phụ thuộc vào các giá trị và không chỉ các loại.
Điều này có vẻ giống như các loại phụ thuộc, nhưng nó hạn chế hơn. Ví dụ, loại occupied
phụ thuộc vào giá trị của Board
. Ở trên, dòng cuối cùng không hoạt động vì loại c2
là b2.Coordinate
, trong khi occupied
loại là Set[b1.Coordinate]
. Lưu ý rằng người ta có thể sử dụng một mã định danh khác có cùng loại b1
, vì vậy nó không phải là mã định danh b1
được liên kết với loại. Ví dụ, các công việc sau:
val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3