Вопрос про изменчивость Scala - PullRequest
4 голосов
/ 27 июля 2010

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

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

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

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

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

удовлетворяет приведенному ниже утверждению

Когда вы определяете переменную с val, переменная не может быть переназначена, но объект, к которому он относится потенциально может быть еще изменено.

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

val str = "immutable string"

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

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

1 Ответ

10 голосов
/ 27 июля 2010

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

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

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