Pregunta

He escrito un rasgo a medida que se extiende Iterator [A] y me gustaría ser capaz de utilizar los métodos que he escrito en un iterador [A] que se devuelve desde otro método. ¿Es esto posible?

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

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

Todavía estoy tratando de conseguir mi cabeza alrededor de la cosa implícitos enteros y no tener parecido a escribir un método en la definición del objeto Bar. ¿Cómo hago para envolver un elemento, al trabajo de la manera que me gustaría por encima de?

¿Fue útil?

Solución

descubierto. Me tomó un par de intentos de entender:

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

y he terminado. Así sorprendentemente corto.

Otros consejos

No creo que esto es posible, sin trucos de juego. Una herencia mixin sucede en tiempo de compilación, cuando puede ser de tipo comprobado estáticamente, y siempre se dirige a otra clase, rasgo, etc. Aquí se intenta virar un rasgo en un objeto existente "sobre la marcha" en tiempo de ejecución.

Existen soluciones como las conversiones implícitas, o tal vez proxies. Probablemente la forma más "limpios" sería hacer Incremento una clase contenedora de delegar a un iterador subyacente. Dependiendo de su caso de uso puede haber otras soluciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top