Question

J'ai écrit un trait personnalisé qui étend Iterator [A] et je voudrais être en mesure d'utiliser les méthodes que j'ai écrit sur un Iterator [A] qui est renvoyée par une autre méthode. Est-ce possible?

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

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

Je suis encore en train d'obtenir ma tête autour de la chose entière de implicits et ne pas avoir beaucoup envie d'écrire une méthode dans la définition de l'objet Bar. Comment puis-je aller sur l'emballage d'un tel élément à travailler dans la façon dont je voudrais ci-dessus?

Était-ce utile?

La solution

figured it out. Il m'a fallu quelques essais pour comprendre:

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

et je suis fait. Donc, étonnamment court.

Autres conseils

Je ne pense pas que cela est possible sans tours de jeu. Un héritage mixin arrive au moment de la compilation, quand il peut être vérifié type statique, et il est toujours ciblé à une autre classe, trait, etc. Ici, vous essayez de virer de bord un trait sur un objet existant « à la volée » lors de l'exécution.

Il existe des solutions de contournement comme les conversions implicites, ou peut-être des procurations. Probablement la façon « propre » serait de faire Incrementation classe wrapper déléguer à un Iterator sous-jacente. En fonction de votre cas d'utilisation il pourrait y avoir d'autres solutions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top