2010-07-27 5 views
4

Je comprends que val mot-clé détermine la variable sous-jacente est un type immuable (ne peut être réaffecté plus tard). Maintenant, je viens à travers un paragraphe dans la programmation en scala (chapitre 3, Les prochaines étapes scala - paramétrez tableaux avec des types), il déclareQuestion sur Scala variable Mutability

val greetStrings: Array[String] = new Array[String](3) 
greetStrings(0) = "Hello" 
greetStrings(1) = ", " 
greetStrings(2) = "world!\n" 

Ces trois lignes de code illustrent un concept important de comprendre à propos de Scala concernant la signification de val. Lorsque vous définissez une variable avec val, la variable ne peut pas être réaffectée, mais l'objet auquel elle fait référence peut potentiellement encore être modifié. Donc dans ce cas, vous ne pouvez pas réattribuer greetStrings à un tableau différent; greetStrings pointe toujours vers le même instance Array [String] avec laquelle il a été initialisé. Mais vous pouvez modifier les éléments de ce tableau [String] au fil du temps, de sorte que le tableau lui-même est mutable.

donc c'est valide pour changer les éléments du tableau. Et son invalide si nous définissons comme celui-ci

greetStrings = Array("a","b","c") 

Il répond à la déclaration ci-dessous

Lorsque vous définissez une variable avec val, la variable ne peut être réaffecté, mais l'objet auquel il renvoie pourrait potentiellement encore être changé.

mais si je déclare quelque chose comme ça

val str = "immutable string" 

Par la définition donnée dans le livre

ce que cela signifie objet auquel il fait référence dans la ligne ci-dessus pourraient être encore changé de code ??

Répondre

10

Déclarer un val ne garantit pas ou même n'implique pas un type immuable. Il déclare uniquement ce que vous pouvez appeler en Java une variable final. L'identificateur ne peut pas être réattribué, mais la valeur peut être d'un type mutable.

Dans votre exemple de valeur de chaîne, vous avez à la fois un val et un type immuable, String. Donc cet identifiant n'est ni réassignable ni modifiable (immuable).

+0

merci Elmo .. Donc, "objet auquel il se réfère pourrait potentiellement encore être changé" applicable uniquement pour les tableaux déclarés avec val (immuable) .... ?? – RameshVel

+1

Salut Ramesh. Dans Scala, Array est mutable (mais vous ne pouvez pas changer sa longueur). Si vous voulez une implémentation immutable d'une collection, vous pouvez essayer List. – Elmo

+0

merci Elmo .. je viens de commencer à lire Liste .. :) – RameshVel