2017-01-03 4 views
1

Ich mag aus bestehenden Seq Sammlung eine neue benutzerdefinierte Scala Sammlung erstellen. Ich habe eine Eigenschaft namens Ref, die die Daten wie untenin Scala

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

Meine individuelle Sammlung hält Vec benannt, die eine Sequenz von Ref ist [A] (dh Vec [A] Äquivalente Seq [Ref [A]]), Der Grund, warum ich so eine benutzerdefinierte Sammlung erstellen möchte, weil ich den Typ-Parameter Ref in der Sammlung beibehalten möchte, um ihn in benutzerdefinierten Methoden zu verarbeiten. Mein Code wie unten

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] 

Aber wenn ich map() Funktion

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

Es gibt eine Seq [Zeichenfolge] nennen, das erwartete Ergebnis ist Vec [Zeichenfolge]. Ich versuchte auch, benutzerdefiniertes CanBuildFrom in Begleiter-Objekt mit SeqFactory [Seq] zu erstellen, aber es schlug fehl. :(:(

Kann jemand mir einige Ratschläge geben darüber und wie ich implementieren, dies zu erreichen?

Antwort

2

Sie benötigen eine benutzerdefinierte Builder und machen newBuilder Methode in VecLike Rückkehr zu ihrer Umsetzung. Diese Seite Check out für ein sehr gutes Tutorial zur Implementierung kundenspezifische Kollektionen: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html

+0

Ich wollte den Autor des Kommentars schätzen und dann erkennen, dass es ist von @Dima erhalten. Was für ein Zufall? Oh, das ist die beste Antwort für diese Frage. –

0

ich beenden es, dass mein Fehler, das ich falsch CanBuildFrom erstellt Im Folgenden die vollständige Umsetzung ist mit CanBuildFrom (CBF Inspiriert von Scala GenericCanBuildFrom)

.

Jetzt kann ich Vec Ergebnis anstelle von Seq nach Aufruf Karte() Funktion, wie unten

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