2011-12-19 26 views
2

我正在閱讀Scala List API。我無法弄清楚下面的配套功能的用法。scala List的配套函數返回GenericCompanion的用例是什麼?

def companion : GenericCompanion[List] 

The factory companion object that builds instances of class List. 

它似乎是爲了列表中的某些功能,而不是爲最終用戶直接使用它。如果是這樣的話,那麼如何知道函數是否不被應用程序開發人員直接使用呢?當然,這只是我的教育假設,如果我錯了,我想糾正。

回答

4

不知道在集合庫的設計選擇的細節,我想我可以看到兩個使用此處:

  1. 幹。有點內在,但有一個伴侶對象作爲一個類型特定的Builder的工廠建築是集合庫中的一種常見模式,因此將它重構爲每個集合實現組成的類都可以減少重複。

  2. 抽象。公開「伴侶」爲客戶端代碼提供了一種方法,可以構建與實例相同類型的新集合,而不必知道該類型是什麼類型。如果你想創建更一般的集合處理函數來返回一致的類型,這會很有用。

下面是如何可能是有用的一些例子:

scala> val a: Traversable[Int] = Set(1,2,3,4) 
a: Traversable[Int] = Set(1, 2, 3, 4) 

scala> a.companion(1,2,3) 
res1: Traversable[Int] = Set(1, 2, 3) 

scala> val b: Traversable[Int] = List(1,2,3,4) 
b: Traversable[Int] = List(1, 2, 3, 4) 

scala> b.companion(1,2,3) 
res2: Traversable[Int] = List(1, 2, 3) 

scala> def ends[T](c: Traversable[T]) : Traversable[T]= { 
|  c.companion(c.head, c.last) 
|  } 
ends: [T](c: Traversable[T])Traversable[T] 

scala> ends[Int](List(1,2,3,4,5)) 
res3: Traversable[Int] = List(1, 5) 

scala> ends[Int](Set(1,2,3,4,5)) 
res4: Traversable[Int] = Set(5, 4) 

注意,「結束」不知道它接收其Traversable的亞型,但是能夠回饋一個使用同伴構建的兼容類型的新集合。

+0

如果您不介意,我希望看到代碼片段。 – 2011-12-20 18:06:17

+0

添加了一個簡單的片段,使我所建議的更清晰。 – 2011-12-20 22:28:41

+0

謝謝!現在一切都說得通了! – 2011-12-21 19:57:49

3

這個想法是,層次結構頂部的特徵可以獲得伴隨(和其中包含的構建器),以便它可以在層次結構的底部構建集合類型的集合。只有我不知道它在哪裏使用,因爲已經有一個newBuilder方法可以提供。

相關問題