2013-05-29 26 views
8

Như tiêu đề của câu hỏi này cho thấy: câu hỏi của tôi là nhiều hơn về hình thức (quy ước thành ngữ) hơn chức năng. Đặt gọn gàng:Scala thành ngữ: Sự khác biệt ngữ nghĩa giữa <Collection> Thích và <Collection> Các loại?

Sự khác biệt ngữ nghĩa giữa MyCollectionLikeMyCollection là gì?

Như ví dụ: sự khác biệt giữa StringLikeString hoặc MapLikeMap là gì. Nhìn kỹ vào tài liệu API Scala, tôi có thể nói rằng XLike thường là loại siêu của X. Nhưng, ngoài ra, tôi không rõ ràng về sự khác biệt ngữ nghĩa giữa các lớp trừu tượng này.

Trong thực tế, nếu tôi đang tạo một lớp/đặc điểm mới, hiểu sự khác biệt này sẽ hữu ích khi tôi chọn tên cho lớp đã nói.

vấn đề cụ thể của tôi, nơi này đã đưa ra như sau:

Tôi muốn tạo ra những đặc điểm: SurjectiveMap[K, T] có thể được trộn lẫn trong với một trong hai Map[K, Set[T]] hoặc MapLike[K, SetLike[T]]. Do tôi không biết sự khác biệt ngữ nghĩa giữa *Like*, tôi không chắc chắn nên làm gì với.

Trả lời

3

Sự khác biệt tương tự như giữa IFoo và Foo, Bar và BarImpl (trừ một thực tế rằng TraversableLike là siêu đặc điểm, trong đó có thực hiện):

Thư viện sưu tập Scala tránh sự trùng lặp mã và đạt được nguyên tắc "cùng loại kết quả" bằng cách sử dụng trình xây dựng chung và traversals qua bộ sưu tập trong cái gọi là đặc điểm triển khai. Những đặc điểm này là được đặt tên với hậu tố Thích; ví dụ, IndexedSeqLike là đặc tính thực hiện cho chỉ mục Index, và tương tự, TraversableLike là đặc điểm triển khai cho Traversable. Các lớp thu thập như Traversable hoặc IndexedSeq kế thừa tất cả các phương pháp cụ thể của chúng triển khai từ những đặc điểm này.

từ Scala collections architecture

1

Tôi nghĩ rằng bằng cách sử dụng Like đặc điểm cho phép bạn tinh chỉnh sự trở lại (đại diện) các loại. Điều này liên quan đến nhiều công việc hơn. Hãy so sánh:

import collection.generic.CanBuildFrom 

object FooMap { 
    type Coll = FooMap[_, _] 
    implicit def canBuildFrom[A, B]: CanBuildFrom[Coll, (A, B), FooMap[A, B]] = ??? 
} 
trait FooMap[A, +B] extends Map[A, B] { 
    def foo = 33 
} 

def test(f: FooMap[Any, Any]) { 
    f.map(identity).foo // nope, we ended up with a regular `Map` 
} 

so

object FooMap extends collection.generic.ImmutableMapFactory[FooMap] { 
    override type Coll = FooMap[_, _] 
    implicit def canBuildFrom[A, B]: CanBuildFrom[Coll, (A, B), FooMap[A, B]] = ??? 
    def empty[A, B]: FooMap[A, B] = ??? 
} 
trait FooMap[A, +B] extends Map[A, B] 
    with collection.immutable.MapLike[A, B, FooMap[A, B]] { 

    def foo = 33 
    override def empty: FooMap[A, B] = FooMap.empty[A, B] 
} 

def test(f: FooMap[Any, Any]) { 
    f.map(identity).foo // yes 
} 

Các đặc điểm MapLike phải được trộn lẫn trong sau khi Map đặc điểm cho các loại trở lại đúng để kick trong


Tuy nhiên bạn không nhận được. tất cả mọi thứ miễn phí có vẻ như, ví dụ bạn sẽ cần phải ghi đè lên nhiều phương thức khác:

override def +[B1 >: B](kv: (A, B1)): FooMap[A, B1] // etc. 
Các vấn đề liên quan