2012-03-23 10 views
7

は、私たちはなぜtoVector標準のコレクション型で(ToListメソッド、内のtoArrayのような)方法はない、デフォルトのシーケンスタイプとしてベクトルを使用することになっている場合は?試作段階でtoVector(toList、toArray)のような標準的なコレクション型のメソッドがないのはなぜですか?

、それは、配列型へのすべてのコレクションを準拠し、(配列にすべてを投じる)すべてのコレクション・リターンにtoSeqを使用しても大丈夫でしょうか?

答えて

14

通常、あなたは具体的な実装であるSeqLinearSeq、むしろListよりIndexedSeqArray、およびVectorの観点で考えなければならない、すなわち、コレクションではなく、その具体的なタイプよりも実装インタフェースともっと心配する必要があります。だから、間違いなくそこにどちらかtoListtoArrayことが、私は彼らが基本だから、彼らはそこにいると思うべきではありません。

実際にtoIndexedSeqメソッドはVectorを提供しますが、効率的な実装を提供するためにコレクションがこれをオーバーライドしない限りVector() ++ cでベクトルを作ることもできます。cはあなたのコレクションです。あなたが.to[List].to[Array].to[Vector]、またはその他の互換性のCを書くことができるように

+0

だから、すべて設定することをお勧めします(特定の機能やパフォーマンスに必要な場合を除いて)特定のタイプではなくIterableに変更することができますか? – sdkfasldf

+3

すべてのIterablesをカバーする必要があるなら、是非それをしてください。しかし、誤ってあなたのメソッドをMapに渡すと、コンパイラは不平を言うことはありません! OOでは一般的に、その理論は可能な最も一般的な型を受け入れ、最も具体的なものを返すことになっていると考えています。コレクションでは、受け入れ型を一般化すると、返される型も非常に一般的になります(この質問を参照してください:http://stackoverflow.com/q/8235462/770361)。したがって、実際には 'List'などのメソッドを使うことになります。' Seq'はIMOを使うための良い妥協です。 –

+4

とにかくtoVectorがあるべきだと思います。時にはAPI境界のように、コード全体をインタフェースとすることは重要ですが、ほとんどの場合、作業を終わらせようとしていて、 'toVector'の欠如はちょっと面倒です。 'Vector'は大きな汎用コレクションです。 'List'と' Array'の使い方はやや特殊です。 –

3

Scalaの2.10は、メソッド.to[C[_]]が付属しています。

+1

そして、 '.to [Seq]'は、少なくとも私が試したケースではVectorを生成します。 – AmigoNico

+0

@AmigoNico、それは 'Seq'は具体的な型ではなく、形質であるからです。 – missingfaktor

+1

はい、申し訳ありません - その場合はVectorが選択されたことを指摘していました。 – AmigoNico

1

Scalaの2.10は、同様に、[ベクター] .TOだけではなく追加されますが、.toVector:

コレクションとイテレータによって継承TraversableOnceトレイトで:

abstract def toVector: Vector[A] 
関連する問題