странное поведение ArrayBuffer - PullRequest
4 голосов
/ 15 января 2012

Может кто-нибудь объяснить мне, почему метод 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)

Ответы [ 3 ]

5 голосов
/ 15 января 2012

Поскольку padTo возвращает новую последовательность (она не изменяет существующую):

Попробуйте

var c = b.padTo(10,0)

c.toArray

См. Также: https://issues.scala -lang.org / browse / SI-2257

4 голосов
/ 15 января 2012

Если вы посмотрите документацию , вы увидите разницу:

def append (elems: A*): Unit

Вариант использования (добавление): добавляет указанные элементы в этот буфер.

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

Вариант использования (padTo): Добавляет значение элемента в этот буфер массива, пока не будет достигнута заданная длина цели.

Append возвращает Unit , тогда как padTo возвращает новый ArrayBuffer .

2 голосов
/ 15 января 2012

С scaladoc :

возвращает: новую коллекцию типа, состоящего из всех элементов этого массива, за которым следует минимальное число вхожденийЭлемент так, чтобы полученная коллекция имела длину не менее len.

Таким образом, b, даже изменяемый, не изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...