Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Can';我不理解游戏2.0中的Iteratee.fold_Scala_Playframework 2.0_Iterate - Fatal编程技术网

Scala Can';我不理解游戏2.0中的Iteratee.fold

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

我正在阅读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)))
}  

在每个case语句中,我们调用DoneCont构造函数。但是这些构造函数是在哪里定义的呢?我推断它们一定是Iteratee特性的实现者,但我无法通过对“extends Iteratee”执行ctrl+F来找到它们。

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

请参阅或:


它不是一个构造函数<代码>完成(s,Input.EOF)
完成。应用(s,Input.EOF)
。与
Cont

相同,哦,这是一种单例方法!令人困惑的是,他们试图把它伪装成一个类。谢谢构造函数的调用应该以
new
开始@Mark:作为警告,它们不是Java意义上的构造函数,而是ADT意义上的构造函数,您经常会看到对“the
Done
构造函数”的引用,这正是您在这里看到的内容。@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))
  }
}