7

VectorBuilderと同じソース ファイルで定義されていますVectorVectorは不変であり、scala.collections.immutableパッケージに含まれているため、結果としてビルダーは同じパッケージに含まれています。

私が知る限り、戻り値の型が明示的に型指定されていない場合、デフォルトとしてCanBuildFroma を使用します。VectorBuilder

  • 可変パッケージの別のファイルにビルダーがない理由はありますか?
  • ビルダーは直接使用するためのものではありませんか? その場合、どのビルダーまたはバッファーを使用してSeq?
4

2 に答える 2

3

VectorBuilder直接使用するためのものではありません。のビルダーを取得したい場合はVector、 を呼び出すだけでよくVector.newBuilder[T]、これは を返しますBuilder[T, Vector[T]](基礎となるインスタンスはVectorBuilderです)。

したがって、を作成するために使用されるデフォルトのビルダーが必要な場合は、次のSeqように呼び出すだけですSeq.newBuilder

scala> Seq(1,2,3)
res0: Seq[Int] = List(1, 2, 3)

scala> Seq.newBuilder[Int]
res1: scala.collection.mutable.Builder[Int,Seq[Int]] = ListBuffer()

scala> Seq.newBuilder[Int].result
res2: Seq[Int] = List()

上記は、 のデフォルトの実装Seqが list であることを示しており、論理的には、 a のデフォルトのビルダーSeqは実際には amutable.ListBufferです。

ListBufferは単なるListビルダーではcollection.mutableありVectorBuilderません。Bufferそのため、ビルド a 以外には使用できませんVector。でローカルに定義されているのはおそらくそのためですVector。なぜそうでないのかわかりません。それ自体privateのパブリック API のどこにも参照されていません。Vector多分それは(プライベート)であるべきです。


参考までに、 で起こっている隠された魔法はありません。ほとんどの場合、上記CanBuildFromを通過するだけです。newBuilder

  1. のように、予期されるコレクション タイプを指定しない場合、使用できるのは、コンパニオン オブジェクト aからSeq(1,2).map(_+1)のものだけであり、タイプはです。つまり、結果も a になります。CanBuildFrom SeqCanBuildFrom[Seq[_], T, Seq[T]]Seq

  2. コレクションのほとんどのコンパニオン オブジェクトと同様に、CanBuildFromインスタンスSeqが提供する機能は 1 つだけです: call ( GenTraversableFactorySeq.newBuilderで定義されています ...)

そのためCanBuildFrom、 forは をVector使用しVectorBuilderます。たとえば、次のようになります。

scala> Vector(1,2,3).map(_+1)
res12: scala.collection.immutable.Vector[Int] = Vector(2, 3, 4)

使用したビルダーは次のとおりです。

scala> implicitly[CanBuildFrom[Vector[Int], Int, Vector[Int]]].apply()
res13: scala.collection.mutable.Builder[Int,Vector[Int]] = 
  scala.collection.immutable.VectorBuilder@43efdf93
于 2013-07-11T20:12:00.700 に答える
1

変更可能な Vector はありません。と同様にListSetBuilder、ビルダーは構築中のものの近くにとどまります。

mutable.StringBuilderよりファーストクラスで頻繁に使用されるタイプであり、API を介して渡される傾向があるため、異常です。(コレクションの概要で言及されており、インポートは必要ありません。実際、 Java とは微妙に異なるため、このパズルゲームで役割を果たしてStringBuilderいますが、Java を使用していることを忘れる可能性があります。)

VectorBuilderパブリック API です。on コンパニオン オブジェクトはnewBuilder、コレクション ファクトリ フレームワークおよびCanBuildFrom. どちらも、物事の作り方を説明する概要には言及されていません。次のようなスニペットは思い出せません。

(ListBuffer.newBuilder[String] += "hello" += "world").result.toList

を作成する方法はVector何をしているかによって異なりますが、概要では、コンパニオンのファクトリ メソッドが提案されています。すでにコレクションがある場合 (厳密ではない可能性があります)、toVector. どうやって何かのコレクションを作るのですか?

これは、 Seq に List ではなく Vector を選択する際の良い Q&Aです。

実装の詳細として、VectorPointerscaladoc に表示されるものには大きなコメントが含まれています。

// USED BY BUILDER

VectorPointerですのでprivate[immutable]、ビルダーは実際問題としてそこにとどまらなければなりません。これは、何を API として公開するかについて、ある程度の考慮が払われたことも示唆しています。

さらにVector、同様のコメントがあります。

// in principle, most members should be private. however, access privileges must
// be carefully chosen to not prevent method inlining

これらのコメントは、アクセス レベルがでたらめではないことを示唆しています。

この質問は、パッケージのデザインを考える興味深い機会です。Scala コレクションはロールシャッハ インクブロット テストであり、偉大な美しさと対称性を明らかにすると同時に、混乱した心には、宇宙の大きな不均衡を明らかにしているのかもしれません。(ちょっと冗談です。)

于 2013-07-12T06:00:41.047 に答える