2011-01-05 49 views
20

Nhìn vào scaladoc cho Traversable và TraversableLike, tôi đang gặp khó khăn trong việc tìm ra sự khác nhau giữa chúng là gì (ngoại trừ việc mở rộng khác). Sự khác biệt rõ ràng duy nhất trong tài liệu là nó nói Traversable là một "đặc điểm" và TraversableLike là một "đặc điểm mẫu". Nhưng googling cho "tính năng mẫu" không tiết lộ một định nghĩa cho thuật ngữ này. Cứu giúp!sự khác biệt giữa "đặc điểm" và "đặc điểm mẫu" là gì?

Trả lời

21

Tôi chưa thấy thuật ngữ này được sử dụng phổ biến ở Scala, và tôi nghĩ nó đặc trưng cho việc thiết kế API bộ sưu tập Scala. Bạn có thể tìm hiểu thêm bằng cách đọc The Architecture of Scala Collections (đặc biệt là phần "tính toán các hoạt động chung") [1] và the Scala collections SID. §4.2 của SID là có liên quan, mặc dù chúng được gọi là "các đặc điểm thực hiện" ở đó:

Các lớp tập hợp như Traversable hoặc Vector kế thừa tất cả các triển khai phương pháp cụ thể của chúng từ một đặc điểm thực hiện. Những đặc điểm này được đặt tên với Like suf fi x; ví dụ VectorLike là đặc điểm thực hiện cho Vector và TraversableLike là đặc điểm triển khai cho Traversable.

Nói tóm lại, mục đích của họ là cả hai để thực hiện riêng biệt để sử dụng bên ngoài hệ thống phân cấp các bộ sưu tập (ví dụ StringOps kéo dài TraversableLike nhưng không Traversable) và yếu tố ra các hoạt động chung trong một cách mà các loại bộ sưu tập được bảo tồn (xem IttayD's answer để có giải thích kỹ lưỡng hơn).

Tôi nên lưu ý rằng bạn thực sự không cần phải quan tâm đến các lớp này trừ khi bạn đang mở rộng phân cấp bộ sưu tập. Để sử dụng thông thường, hãy tập trung vào các đặc điểm Traversable, Iterable, Seq, v.v. Nếu bạn mới sử dụng API Bộ sưu tập Scala, tôi khuyên bạn nên bắt đầu với Scala 2.8 Collection API document, sau đó tham khảo scaladoc nếu cần. Bạn không thể mong đợi để có được 'bức tranh lớn' nhìn qua scaladoc.

[1] tín dụng được chuyển đến michid cho liên kết này

+2

Cảm ơn câu trả lời tuyệt vời của bạn! Tuy nhiên, câu cuối cùng làm tôi buồn một chút: "bạn không thể mong đợi để có được 'bức tranh lớn' nhìn qua scaladoc" - thật không may ... Tôi cảm thấy rằng trong trường hợp của thư viện chuẩn Java (ít nhất là đối với các gói "lõi" java.lang, java.util, v.v. đã có từ 1.1), tôi có thể có được bức tranh lớn bằng cách xem qua javadoc. – Adam

22

Các đặc điểm XXXLike có vai trò quan trọng trong việc thêm thông số chung của Repr. Các phương thức được cho là trả về cùng một loại bộ sưu tập, như bộ lọc, bản đồ, sơ đồ phẳng, được triển khai ở các đặc điểm mức thấp (TraversableLike). Để mã hóa kiểu trả về của họ, những đặc điểm nhận nó:

trait TraversableLike[+A, +Repr] ... 
    ... 
    def filter(p: A => Boolean): Repr = { 

(cho bản đồ và flatMap vấn đề phức tạp hơn, tôi sẽ không đi vào nó ở đây)

Bây giờ nói rằng bạn có một loại mới của bộ sưu tập. Bạn có thể làm:

trait MyCollection[+A] extends TraversableLike[A, MyCollection] 

Nhưng sau đó nếu bất kỳ ai muốn mở rộng bộ sưu tập của bạn, chúng bị mắc kẹt với giá trị trả về của MyCollection từ các phương pháp kế thừa khác nhau.

Vì vậy, thay vào đó, bạn tạo:

trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr] 

trait MyCollection[+A] extends MyCollectionLike[A, MyCollection] 

và bất cứ ai mà muốn mở rộng bộ sưu tập của bạn kéo dài MyCollectionLike

+0

IttayD, đây phải là Câu hỏi thường gặp # 1 trên trang web Scala. Có ít nhất ba cách khác nhau để loại bỏ "kiểu trả về của phương thức này giống như lớp thừa kế" - biết cái nào được sử dụng cho thư viện bộ sưu tập Scala (và đó là cơ chế ưu tiên) nhiều người bắt đầu Scala nên được hiển thị. – Adam

1

Các [...] Giống như lớp là các lớp thực hiện cho các lớp sưu tập thực tế.Theo nghĩa nào đó, chúng hoạt động giống như việc triển khai khuôn mẫu mà từ đó nhất - nếu không phải tất cả - hành vi được thừa kế bởi các lớp sưu tập thực tế.

Để biết tổng quan rất chi tiết và dễ tiếp cận, hãy đọc The Architecture of Scala Collections.

Các vấn đề liên quan