2012-12-15 4 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))) 
} 

, 우리는 또는 계속 생성자를 완료를 요구하고있다. 그러나 이러한 생성자는 어디에 정의되어 있습니까? 나는 이것들이 특성의 구현 자일 것임을 추측한다. 그러나 나는 "extend Iteratee"에 대해 ctrl + F를 사용하여 그들을 찾을 수 없다.

답변

4

docementation 또는 source를 참조하십시오

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의 의미로 사용됩니다. "Done 생성자"는 여기서 보게되는 것을 정확하게 의미합니다. –

-1

DoneIteratee을 직접 확장 할 필요가 없습니다. 다른 클래스 나 특성을 확장하여 Iteratee을 확장 할 수 있습니다. class Cont을 검색 한 다음 거기에서 상속 관계를 따를 수 있습니다.