Scala Can';我不理解游戏2.0中的Iteratee.fold
我正在阅读Iteratee.scala的源代码: 特别是构造“折叠”迭代器的方便方法Scala Can';我不理解游戏2.0中的Iteratee.fold,scala,playframework-2.0,iterate,Scala,Playframework 2.0,Iterate,我正在阅读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
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)))
}
在每个case语句中,我们调用Done或Cont构造函数。但是这些构造函数是在哪里定义的呢?我推断它们一定是Iteratee特性的实现者,但我无法通过对“extends Iteratee”执行ctrl+F来找到它们。
Done
不需要直接扩展Iteratee
。它可以扩展另一个类或特征,然后扩展Iteratee
。您可以搜索类Cont
,然后从中遵循继承关系。请参阅或:
它不是一个构造函数<代码>完成(s,Input.EOF)
完成。应用(s,Input.EOF)
。与Cont
相同,哦,这是一种单例方法!令人困惑的是,他们试图把它伪装成一个类。谢谢构造函数的调用应该以new
开始@Mark:作为警告,它们不是Java意义上的构造函数,而是ADT意义上的构造函数,您经常会看到对“theDone
构造函数”的引用,这正是您在这里看到的内容。@TravisBrown:在这种情况下不是,因为Iteratee不是类型的组合。对吗?
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))
}
}