我正在查看Scala 2.12集合库的源代码,并注意到以下内容:
trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
//methods
implicit class MonadOps[+A](trav: TraversableOnce[A]) {
def map[B](f: A => B): TraversableOnce[B] = trav.toIterator map f
def flatMap[B](f: A => GenTraversableOnce[B]): TraversableOnce[B] = trav.toIterator flatMap f
def withFilter(p: A => Boolean) = trav.toIterator filter p
def filter(p: A => Boolean): TraversableOnce[A] = withFilter(p)
}
}
将Monad Ops归入implicit
类的原因是什么? Traversable
的{{1}}子特征将这所有单子方法都定义为不是隐式类(尽管通过TraversableOnce
)。
答案 0 :(得分:1)
Iterator
(我们只希望遍历一次)是扩展TraversableOnce
而未扩展Traversable
的示例。 MonadOps
上的方法将在那里使用。
注意MonadOps
在伴随对象中,而不是特征。
另外请注意,{2.1中已弃用TraversableOnce
,而推荐使用IterableOnce
。