2010-08-15 3 views
4

Iterator [A]를 확장하는 사용자 지정 특성을 작성했으며 Iterator [A]에서 작성한 메서드를 사용할 수 있기를 바랍니다. 다른 메소드에서 반환되었습니다. 이것이 가능한가?스칼라 : 반환 형식을 사용자 지정 특성으로 변환

trait Increment[+A] extends Iterator[A]{ 
    def foo() = "something" 
} 

class Bar(source:BufferedSource){ 
    //this ain't working 
    def getContents():Increment[+A] = source getLines 
} 

난 여전히 전체 implicits 것은 주위에 내 머리를 얻으려고 노력하고 Bar Object 정의하는 방법을 쓰는처럼 많이 가지고 있지 않다. 위와 같은 방식으로 작동하도록 이러한 항목을 배치하는 방법은 무엇입니까?

답변

6

알아 냈어. 몇 가지 이해하려고 시도 :

object Increment{ 
    implicit def convert(input:Iterator[String]) = new Increment{ 
     def next() = input next 
     def hasNext() = input hasNext 
    } 
} 

나는 끝났어. 너무 놀랍게 짧습니다.

+1

아마도 iterator2increment 메소드를 호출하는 것이 좋습니다. –

2

트릭을하지 않고도 가능하지 않다고 생각합니다. mixin 상속은 정적으로 유형을 검사 할 수있는 컴파일 타임에 발생하며, 항상 다른 클래스, 특성 등을 대상으로합니다. 여기서는 런타임에 기존 객체의 특성을 "실시간"으로 집어 넣으려고합니다.

암시 적 변환이나 프록시 같은 해결 방법이 있습니다. 아마도 "가장 깨끗한"방법은 Increment를 기본 Iterator에 위임하는 래퍼 클래스로 만드는 것입니다. 유스 케이스에 따라 다른 솔루션이있을 수 있습니다.

+0

트릭을 해결할 암시 적 변환이 있어야한다고 생각합니다. 그러나이 솔루션은 계속해서 나를 피합니다. – wheaties