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

如果您查看文档,您会发现不同之处:

def append (elems: A*): Unit

用例(附加):将给定元素附加到此缓冲区。

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

用例 (padTo):将元素值附加到此数组缓冲区,直到达到给定的目标长度。

Append返回 Unit,而 padTo返回新的 ArrayBuffer

于 2012-01-15T18:09:10.750 回答
2

scaladoc

返回:一个新的类型集合,它由这个数组缓冲区的所有元素组成,后跟最少出现的 elem,因此结果集合的长度至少为 len。

所以,b,即使是可变的,也不会改变。

于 2012-01-15T18:03:09.870 回答