4

ArrayBuffer の padTo メソッドが期待どおりに機能しない理由を誰かに説明してもらえますか? この例では、toArray によって作成された配列の長さは 10 であると予想されます。

scala> val b = new scala.collection.mutable.ArrayBuffer[Byte]
b: scala.collection.mutable.ArrayBuffer[Byte] = ArrayBuffer()

scala> b.append(2)

scala> b
res1: scala.collection.mutable.ArrayBuffer[Byte] = ArrayBuffer(2)

scala> b.append(2)

scala> b
res3: scala.collection.mutable.ArrayBuffer[Byte] = ArrayBuffer(2, 2)

scala> b.padTo(10,0)
res4: scala.collection.mutable.ArrayBuffer[AnyVal] = ArrayBuffer(2, 2, 0, 0, 0, 0, 0, 0, 0, 0)

scala> b.toArray
res5: Array[Byte] = Array(2, 2)
4

3 に答える 3

5

padToは新しいシーケンスを返すため(既存のシーケンスを変更しません):

試す

var c = b.padTo(10,0)

c.toArray

参照:https ://issues.scala-lang.org/browse/SI-2257

于 2012-01-15T18:00:54.773 に答える
4

documentationを見ると、違いがわかります。

def append (elems: A*): Unit

ユース ケース (追加): 指定された要素をこのバッファーに追加します。

def padTo (len: Int, elem: A): ArrayBuffer[A]

ユース ケース (padTo): 指定されたターゲットの長さに達するまで、要素の値をこの arraybuffer に追加します。

Appendは Unit を返し、padToは new ArrayBufferを返します。

于 2012-01-15T18:09:10.750 に答える
2

scaladocから:

戻り値:このarraybufferのすべての要素と、それに続くelemの最小出現回数で構成される、タイプの新しいコレクション。結果のコレクションの長さは少なくともlenになります。

したがって、bは、変更可能であっても変更されません。

于 2012-01-15T18:03:09.870 に答える