Các loại phụ thuộc đường dẫn của Scala có nghĩa là gì?


125

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?


2
@Michel - Tôi thậm chí còn biết PDT là gì; Tôi đã hy vọng rằng SO có thể được làm giàu với một câu trả lời!
oxbow_lakes

1
Tôi hy vọng sẽ có câu trả lời chặt chẽ sau khi đọc ch12 về PDT
stacker

Câu trả lời:


165

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 Coordinatephụ thuộc vào thể Boardhiệ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 occupiedphụ 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 c2b2.Coordinate, trong khi occupiedloạ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

2
+1 cho câu trả lời. Tôi thấy câu cuối khó hiểu: Bạn nói 'loại an toàn phụ thuộc vào giá trị và không phải loại một mình'. Đối với tôi, điều này nghe giống như các loại phụ thuộc, nhưng các loại phụ thuộc đường dẫn không phụ thuộc vào giá trị mỗi se. Bạn có nghĩ nó cũng khó hiểu không?
Matthew Farwell

4
@Matthew tôi hiểu những gì bạn đang nói, nhưng phụ thuộc đường loại làm phụ thuộc vào giá trị, thậm chí nếu nó không cung cấp sự linh hoạt thường gắn liền với các loại phụ thuộc.
Daniel C. Sobral

1
Chính xác, đó là những gì tôi muốn nói. Ban đầu tôi đọc rằng loại phụ thuộc vào các giá trị được truyền cho hàm tạo, không phải b1 / b2. Tôi hiểu nó bây giờ, nhưng tôi phải mất vài lần đọc để có được nó.
Matthew Farwell

3
Giải thích đơn giản nhất là các loại phụ thuộc vào đường dẫn chỉ là các lớp có các bao đóng, chính xác là cùng một cách các hàm có thể liên kết các biến từ phạm vi.
polkovnikov.ph

1
Nhưng có lẽ có một sự khác biệt cơ bản cho sự tương tự này: một ràng buộc diễn ra trong thời gian chạy (đối với các bao đóng) và ràng buộc khác diễn ra tại thời gian biên dịch (đối với các loại phụ thuộc đường dẫn).
jhegedus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.