2011-06-27 18 views
7

Estoy leyendo el libro de programación en Scala Scala por el creador y estoy un poco confundir con el ejemplo de conjunto.conjunto de Scala mutable e inmutable cuándo usar Val y var

aquí está para Inmutable Set:

var jetSet = Set("Boeing", "Airbus") 
jetSet += "Lear" 
println(jetSet.contains("Cessna")) 

Cuál es el punto de esto?

El conjunto es inmutable pero la variable jetSet es mutable. 1) ¿Entonces cada vez que agrego al conjunto con + = crea un nuevo conjunto? Entonces, ¿la variable apunta a un nuevo conjunto en la memoria?

2) ¿No debería ser: val jetSet = set("cow","sheep","duck")? ¿Por qué tiene que ser una var? ¿Hay alguna razón para usar var para un conjunto inmutable?

Respuesta

16

La ventaja de las estructuras de datos inmutables, en este caso Conjunto, es que son persistentes. Por ejemplo:

var jetSet1 = Set("Boeing", "Airbus") 
val jetSet2 = jetSet1 // ... imagine jetSet2 is somewhere else in the program 
jetSet1 += "Lear" 
assert(!jetSet2.contains("Lear")) 

inmutabilidad de este conjunto de objetos hace que sea más fácil de razonar sobre el programa debido a cambios a la variable jetSet1 no tienen efectos secundarios en otras partes del código (en este caso, donde se utiliza jetSet2) Aunque no está claro en este ejemplo, hay ocasiones en las que es conveniente almacenar valores inmutables en referencias var mutables; la mayoría de las veces, el var tendrá un alcance limitado (por ejemplo, local para una función).

Las estructuras de datos inmutables a menudo tienen implementaciones inteligentes que son bastante eficientes. Desafortunadamente, la API de la colección Scala no está bien documentada con respecto al rendimiento, pero esperaría que la mayoría de las operaciones tengan aproximadamente O (log N). Por ejemplo, dado un gran conjunto inmutable s, uno debería ser capaz de construir eficientemente s + x, un nuevo conjunto con un elemento adicional. Por supuesto, la inmutabilidad garantiza que también se conserva s. Debajo del capó, s y s+x se almacenarán utilizando algún tipo de árbol de estructuras de datos con componentes compartidos.

El título de tu pregunta sugerimos que también está buscando consejo sobre el uso val o var. La regla de oro es usar val siempre que pueda convenientemente. Si es necesario var, intente limitar el alcance de la variable tanto como sea posible.

+2

No directamente en la API pero el rendimiento * se * [documentado] (http://www.scala-lang.org/docu/files/collections-api/collections.html). – Debilski

+0

Gracias por el enlace –

+1

Muchas operaciones son, como es de esperar, O (log n), pero debe señalarse que la base del logaritmo es tan alta como para que sean efectivas operaciones O (1). En términos prácticos, las operaciones en las estructuras de datos inmutables de Scala están dentro de un factor constante de las operaciones correspondientes en sus primos mutables. –

6

var le permite reasignar a una variable, piensa en él como una declaración de variables normales en Java. Pero en el caso anterior, aunque esté reasignando a la misma variable, siempre es un conjunto diferente ya que está utilizando uno inmutable.

El objetivo de este ejemplo era demostrar que, incluso si se intenta "modificar" una colección inmutable, las modificaciones crear una nueva colección en vez de tocar la original. Si el autor hubiera utilizado un val (en la línea de final en Java), tendría que introducir una variable en el alcance para mantener el nuevo conjunto inmutable. Creo que var probablemente se usó para mantener el ejemplo simple.

0

no se puede hacer += si utiliza val. el val/var/def se aplica al símbolo y no a su valor/implementación prueba val ... obtendrá una compilación error.

+2

-1 Puedes hacer '+ =' a 'val x: mutable.Set'. –

Cuestiones relacionadas