我正在阅读 Scala List API .我无法弄清楚下面的伴随功能的用途。

def companion : GenericCompanion[List] 
 
The factory companion object that builds instances of class List. 

似乎是为了List中的一些功能,而不是让终端用户直接消费的。如果是这样,人们怎么知道该功能是否不由应用程序开发人员直接使用?当然,这只是我有根据的假设,如果我错了,希望得到纠正。

请您参考如下方法:

在不知道集合库中设计选择的细节的情况下,我想我可以在这里看到两个用途:

  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) 

请注意,“ends”不知道它接收到 Traversable 的哪个子类型,但能够返回使用同伴构建的兼容类型的新集合。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!