在Play 2.0中无法理解Iteratee.fold

时间:2012-12-15 20:08:45

标签: scala playframework-2.0 iterate

我正在阅读Iteratee.scala的源代码:https://github.com/playframework/Play20/blob/master/framework/src/iteratees/src/main/scala/play/api/libs/iteratee/Iteratee.scala

具体是构建“折叠”迭代的便捷方法。

def fold[E, A](state: A)(f: (A, E) => A): Iteratee[E, A] = {
  def step(s: A)(i: Input[E]): Iteratee[E, A] = i match {

    case Input.EOF => Done(s, Input.EOF)
    case Input.Empty => Cont[E, A](i => step(s)(i))
    case Input.El(e) => { val s1 = f(s, e); Cont[E, A](i => step(s1)(i)) }
  }
  (Cont[E, A](i => step(state)(i)))
}  

在每个案例陈述中,我们都在调用完成 Cont 构造函数。但这些构造函数在哪里定义?我推断这些必须是 Iteratee 特征的实现者,但我无法通过ctrl + F找到它们“extends Iteratee。”

2 个答案:

答案 0 :(得分:4)

请参阅docementationsource

object Done {
/**
* Create an [[play.api.libs.iteratee.Iteratee]] in the “done” state.
* @param a Result
* @param e Remaining unused input
*/
  def apply[E, A](a: A, e: Input[E] = Input.Empty): Iteratee[E, A] = new Iteratee[E, A] {
    def fold[B](folder: Step[E, A] => Future[B]): Future[B] = folder(Step.Done(a, e))
  }
}

它不是构造函数。 Done(s, Input.EOF) means Done.apply(s, Input.EOF)。与Cont相同。

答案 1 :(得分:-1)

Done不需要直接扩展Iteratee。它可以扩展另一个类或特征,然后扩展Iteratee。您可以搜索class Cont,然后从那里开始遵循继承关系。