2017-01-03 9 views
1

既存のSeqコレクションから新しいカスタムScalaコレクションを作成したいと思います。私は ScalaでカスタムSeqコレクションを作成

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

以下の文献のシーケンスであるVecと命名マイカスタムコレクション[A](配列へつまりVecと[A]相当[参照[A]])、などのデータを保持している文献という名前の形質を持っていますなぜなら、コレクションのRefの型パラメータをカスタムメソッドで処理する必要があるため、このようなカスタムコレクションを作成したいからです。マイ

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] 

以下のようにコードしかし、私はそれが配列[文字列]を返す

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

マップ()関数を呼び出すときに、期待される結果がVecを[文字列]です。私はSeqFactory [Seq]でコンパニオンオブジェクトでカスタムCanBuildFromを作成しようとしましたが失敗しました。 :(:(

誰が私にこのことについていくつかのアドバイスを与えることができ、どのように私は

答えて

2

カスタムBuilderを実装し、VecLikeリターンそれにnewBuilder方法を作る必要がありますか?これを達成するために実装する。 ために、このページをチェックしてくださいカスタムコレクションを実装する上で非常に良いチュートリアル:http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html

+0

以下のように呼び出しマップ()関数の後の代わりに配列のVecと結果を受信し、それが@Dimaからで実現することができます。なんて偶然?ああ、thiis、この質問のための最善の答えです。 –

0

は、私はそれは私が間違ってCanBuildFromを作成した私のミスだ、それを終え以下CanBuildFrom(ScalaのGenericCanBuildFromからインスピレーションを受けCBF)

との完全な実装です。

今私は、私はこのコメントの著者に感謝するつもりだった

val vec = Vec(1,2,3,4) 
var vecStr : Vec[String] = vec.map(intToString) 
関連する問題