Scala: convertire un tipo di ritorno in un tratto personalizzato
-
28-09-2019 - |
Domanda
Ho scritto un tratto personalizzato che si estende Iterator [A] e mi piacerebbe essere in grado di utilizzare i metodi che ho scritto su un Iterator [A] che viene restituito da un altro metodo. È possibile?
trait Increment[+A] extends Iterator[A]{
def foo() = "something"
}
class Bar( source:BufferedSource){
//this ain't working
def getContents():Increment[+A] = source getLines
}
Sto ancora cercando di ottenere la mia testa intorno alla cosa interi impliciti e non avendo molto simile a scrivere un metodo nella definizione dell'oggetto Bar
. Come potrei fare per il confezionamento tale elemento al lavoro nel modo in cui mi piacerebbe sopra?
Soluzione
capito. Mi ha portato un paio di tentativi per capire:
object Increment{
implicit def convert( input:Iterator[String] ) = new Increment{
def next() = input next
def hasNext() = input hasNext
}
}
e ho finito. Così sorprendentemente breve.
Altri suggerimenti
Non credo che questo è possibile senza trucchi di gioco. Un'eredità mixin avviene al momento della compilazione, quando può essere di tipo controllato staticamente, ed è sempre rivolto a un'altra classe, caratteristica, ecc Qui si tenta di virare un tratto su un oggetto esistente "al volo" in fase di esecuzione.
Non ci sono soluzioni alternative, come le conversioni implicite, o forse proxy. Probabilmente il modo "pulito" sarebbe quello di fare Incremento una classe wrapper delegando a un Iterator sottostante. A seconda del caso d'uso ci potrebbe essere altre soluzioni.