Scala: convertir un tipo de retorno en un rasgo de costumbre
-
28-09-2019 - |
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?
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.