【问题标题】:Can't understand Iteratee.fold in Play 2.0在 Play 2.0 中无法理解 Iteratee.fold
【发布时间】:2012-12-03 11:04:32
【问题描述】:

我在看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)))
}  

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

【问题讨论】:

    标签: scala playframework-2.0 iterate


    【解决方案1】:

    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)meansDone.apply(s, Input.EOF)。与Cont 相同。

    【讨论】:

    • 哦,是单例方法!令人困惑的是,他们正试图将其伪装成一个班级。谢谢!
    • 构造函数的调用应该以new开头。
    • @Mark:作为警告,这些不是 Java 意义上的 构造函数,但它们是 ADT 意义上的,你会经常看到对例如的引用。 “Done 构造函数”就是您在此处看到的内容。
    • @TravisBrown:但在这种情况下不是,因为 Iteratee 不是类型的组合。对吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多