2012-12-15 37 views
3

我讀Iteratee.scala的源代碼理解Iteratee.fold:https://github.com/playframework/Play20/blob/master/framework/src/iteratees/src/main/scala/play/api/libs/iteratee/Iteratee.scala不能在玩2.0

具體地用於構建「摺疊」 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語句,我們呼籲完成構造。但是這些構造函數在哪裏定義?我推斷這些必須是Iteratee特徵的實現者,但我無法通過按Ctrl + F來找到它們以獲得「extends Iteratee」。

回答

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)meansDone.apply(s, Input.EOF)。與Cont一樣。

+0

噢,這是一種單例方法!令人混淆的是,他們試圖將它僞裝成一個班級。謝謝! – Mark

+0

構造函數的調用應該以'new'開始。 – senia

+0

@Mark:作爲一個警告,這些並不是Java的意義上的_constructors_,但它們具有ADT的含義,您經常會看到對「完成」構造函數「,這正是你在這裏看到的。 –

-1

Done不需要直接延伸Iteratee。它可以擴展另一個類或特徵,然後延伸Iteratee。您可以搜索class Cont,然後從那裏遵循繼承關係。