Scala: convertir un type de retour dans un trait personnalisé
-
28-09-2019 - |
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?
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.