3

Iteratee.scalaのソースコードを読んでいます:https://github.com/playframework/Play20/blob/master/framework/src/iteratees/src/main/scala/play/api/libs/iteratee/Iteratee。スカラ

具体的には、「フォールド」イテラティーを構築するための便利な方法です。

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を実行してもそれらを見つけることができませんでした。

4

2 に答える 2

4

文書または出典を参照してください:

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) を意味し Done.apply(s, Input.EOF)ます。と同じContです。

于 2012-12-15T20:32:07.103 に答える
-1

Doneを直接拡張する必要はありませんIteratee。別のクラスまたはトレイトを拡張して、それを拡張することができますIterateeclass Contそこから継承関係を検索して追跡することができます。

于 2012-12-15T20:30:12.320 に答える