2011-08-02 24 views
19

Creo que puedo estar fallando en entender cómo funcionan las colecciones mutables. Yo esperaría colecciones mutables a verse afectados por la aplicación de mapa para ellos o la adición de nuevos elementos, sin embargo:Cómo usar colecciones mutables en Scala

scala> val s: collection.mutable.Seq[Int] = collection.mutable.Seq(1) 
s: scala.collection.mutable.Seq[Int] = ArrayBuffer(1) 

scala> s :+ 2 //appended an element 
res32: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2) 

scala> s //the original collection is unchanged 
res33: scala.collection.mutable.Seq[Int] = ArrayBuffer(1) 

scala> s.map(_.toString) //mapped a function to it 
res34: scala.collection.mutable.Seq[java.lang.String] = ArrayBuffer(1) 

scala> s //original is unchanged 
res35: scala.collection.mutable.Seq[Int] = ArrayBuffer(1) 

//maybe mapping a function that changes the type of the collection shouldn't work 
//try Int => Int 

scala> s.map(_ + 1) 
res36: scala.collection.mutable.Seq[Int] = ArrayBuffer(2) 

scala> s //original unchanged 
res37: scala.collection.mutable.Seq[Int] = ArrayBuffer(1) 

Este comportamiento no parece ser independiente de las colecciones inmutables, por lo que cuando se comportan por separado?

+0

El problema es que ambos métodos asignan y: + devuelven nuevas colecciones, no cambian la colección en su lugar. –

Respuesta

39

Para ambas colecciones inmutables y mutables, :+ y +: crear nuevas colecciones. Si desea colecciones mutables que crecen automáticamente, utilice los métodos += y +=: definidos por collection.mutable.Buffer.

De forma similar, map devuelve una nueva colección: busque transform para cambiar la colección en su lugar.

1

El método map nunca modifica la colección en la que lo llama. El sistema de tipo no permitiría que existiera una implementación de mapa en contexto, a menos que haya cambiado su firma de tipo, de modo que en algún tipo Collection[A] solo se pueda asignar usando una función del tipo A => A.

(Edit: como otras respuestas han señalado, existe un procedimiento de este tipo se llama transform!)

Debido map crea una nueva colección, se puede pasar de un Collection[A] a un Collection[B] utilizando una función A => B, que es mucho más útil.

6

operación map aplica la función dada a todos los elementos de la colección, y produce una nueva colección.

La operación que está buscando se llama transform. Puede considerarlo en contexto map, excepto que la función de transformación debe ser del tipo a -> a en lugar de a -> b.

scala> import collection.mutable.Buffer 
import collection.mutable.Buffer 

scala> Buffer(6, 3, 90) 
res1: scala.collection.mutable.Buffer[Int] = ArrayBuffer(6, 3, 90) 

scala> res1 transform { 2 * } 
res2: res1.type = ArrayBuffer(12, 6, 180) 

scala> res1 
res3: scala.collection.mutable.Buffer[Int] = ArrayBuffer(12, 6, 180) 
Cuestiones relacionadas