2010-07-27 2 views
4

Я понимаю, что ключевое слово val определяет лежащую в основе переменную как неизменяемый тип (не может быть переназначено позднее). Теперь я пришел через пункт в программировании в Скале (глава 3, Следующие шаги в Скале - параметризировать массивы с типами), говоритсяВопрос о переменной Scala Mutability

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

Эти три строки кода иллюстрируют важное понятие, чтобы понять о Scala относительно значения val. Когда вы определяете переменную с val, переменная не может быть переназначена, , но объект, к которому он относится , потенциально может быть изменен. Таким образом, в этом случае вы не можете переназначить greetStrings для другого массива; greetStrings всегда укажет на тот же массив Array [String], с которым был инициализирован. Но вы можете изменить элементы этого массива [String] со временем, поэтому сам массив равен mutable.

поэтому его действительный для изменения элементов массива. И его недействительным, если мы определим, как этот

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

Это удовлетворяет формулировку ниже

При определении переменной с Валу, переменная не может быть переназначен, но объект, к которому он потенциально может быть изменен.

но если я объявить что-то вроде этого

val str = "immutable string" 

По определению, данному в книге

что это означает объект, к которому оно относится потенциально может еще быть изменен в строке выше кода?

ответ

10

Объявление val не гарантирует и не подразумевает неизменяемый тип. Он только объявляет, что вы могли бы назвать в Java final переменной. Идентификатор не может быть повторно назначен, но значение может иметь изменяемый тип.

В вашем примере строкового значения у вас есть как val, так и неизменяемый тип String. Таким образом, этот идентификатор не является повторно назначаемым или изменяемым (неизменным).

+0

спасибо Elmo .. Так что «объект, к которому он относится, потенциально может быть изменен» применим только для массивов, объявленных с val (неизменяемым) .... ?? – RameshVel

+1

Привет Рамеш. В Scala Array изменен (но вы не можете изменить его длину). Если вы хотите неизменную реализацию коллекции, вы можете попробовать List. – Elmo

+0

спасибо Elmo .. я только начал читать List .. :) – RameshVel