2017-01-03 2 views
1

Je souhaite créer une nouvelle collection Scala personnalisée à partir de la collection Seq existante. J'ai un trait nommé Ref qui contient les données comme ci-dessousCréer une collection Seq personnalisée dans Scala

trait Ref[A] { 
    def get: A 
    def getAsOption: Option[A] 
    def dataType: Class[A] 
    // other methods 
} 

Ma collection personnalisée nommée Vec qui est une séquence de référence [A] (c.-à-Vec [A] équivalents à Seq [Ref [A]]), la raison pour laquelle je veux créer une collection personnalisée comme celle-ci parce que je veux garder le paramètre type de Ref dans la collection à traiter dans les méthodes personnalisées. Mon code comme ci-dessous

trait VecLike[A, +Repr <: Seq[Ref[A]]] 
    extends SeqLike[Ref[A], Repr] 
    with TraversableLike[Ref[A], Repr] { 
// custom methods 
} 

trait GenVec[A] 
    extends VecLike[A, Seq[Ref[A]]] 
    with Seq[Ref[A]] 
    with PartialFunction[Int, Ref[A]] 

abstract class AbstractVec[A](vec: Ref[A]*) 
    extends AbstractSeq[Ref[A]] 
    with GenVec[A] {...} 

class Vec(vec: Ref[A]*) 
    extends AbstractVec[A](vec:_*) 
    with VecLike[A, Vec[A]] 
    with GenericTraversableTemplate[Ref[A], Seq] 

Mais quand j'appelle carte fonction

Vec(1,2,3,4).map(intToString) 

() Il renvoie une Seq [chaîne], le résultat attendu est Vec [chaîne]. J'ai également essayé de créer CanBuildFrom personnalisé dans l'objet compagnon avec SeqFactory [Seq] mais il a échoué. :(:(

Quelqu'un peut-il me donner quelques conseils à ce sujet et la façon dont je mets en œuvre pour y parvenir?

Répondre

2

Vous devez implémenter une coutume Builder et faire méthode newBuilder dans VecLike retour il. Consultez cette page pour un très bon tutoriel sur la mise en œuvre des collections personnalisées: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html

+0

je vais apprécier l'auteur de ce commentaire et il est réalisé à partir @Dima. Quelle coïncidence? Oh, c'est la meilleure réponse à cette question. –

0

je l'ai achevé, c'est mon erreur j'ai créé mal CanBuildFrom Voici la pleine mise en œuvre avec CanBuildFrom (CBF Inspiré de Scala GenericCanBuildFrom)

.

Maintenant, je peux recevoir des résultats Vec au lieu de Seq après la fonction de carte d'appel() comme ci-dessous

val vec = Vec(1,2,3,4) 
var vecStr : Vec[String] = vec.map(intToString)