В этом посте исследуются сходства и различия между неизменяемыми значениями и неизменяемыми ссылками. Состояние неизменяемых значений изменить нельзя. Неизменяемые ссылки - это переменные, которые нельзя переназначить.

Scala поддерживает неизменяемые и изменяемые стили кодирования, поэтому программист Scala несет ответственность за знание двух разных стилей и соблюдение философии проектирования базы кода.

Изменяемые ссылки

Давайте воспользуемся ключевым словом var, чтобы присвоить переменной x целочисленное значение.

var x: Int = 6

x можно переназначить другим целым числам, так что это изменяемая ссылка.

x = 10 // this works!

Scala строго типизирован, поэтому, если переменная введена как целое число, ее нельзя присвоить значениям других типов.

x = "bob" // error: type mismatch

Неизменяемые ссылки

Давайте воспользуемся ключевым словом val, чтобы присвоить переменной location строковое значение через неизменяемую ссылку.

val location: String = "airplane"

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

location = "school" // error: reassignment to val

Сравнение переменных Scala с переменными на языке со слабой типизацией

Переменные в слабо типизированных языках программирования, таких как JavaScript, изменяемы и могут быть присвоены значениям любого типа. Это совершенно правильный код JavaScript.

var y = “dog”
y = 55
y = {}

Переменная Scala с типом Any ведет себя как переменная JavaScript, потому что это неизменяемая ссылка, которая может указывать на значения разных типов.

var person: Any = “craig”
person = 22
person = List()

Неизменяемые значения

Давайте напишем Person класс, который создает неизменяемые объекты.

class Person(val firstName: String, val lastName: String) {
  def fullName(): String = {
    s”$firstName lastName”
  }
}

Давайте создадим экземпляр класса Person для создания неизменяемого объекта:

val bob = new Person("bob", "loblaw")

Переменная bob - это неизменная ссылка на неизменяемый объект. У нас нет возможности изменить состояние объекта после его создания, и поэтому оно неизменяемо.

Изменяемые значения

Давайте создадим Dog класс, который создает изменяемые объекты.

class Dog(var breed: String) {
  def about(): String = {
    s”I am a $breed dog”
  }
}

Давайте создадим экземпляр класса Dog.

val fido = new Dog(“lab”)

Переменная fido - это неизменяемая ссылка на изменяемый объект. fido нельзя переназначить, но экземпляр можно изменить.

fido.breed // “lab”
fido.breed = “pug”
fido.breed // “pug”

Scala дает программисту широкие возможности для принятия решений

Некоторые языки программирования допускают только неизменяемые ссылки (например, Haskell), а другие языки допускают только изменяемые ссылки (например, Ruby). Scala позволяет программистам выбирать, использовать ли они неизменяемые ссылки или изменяемые ссылки.

Философия дизайна Scala, заключающаяся в предоставлении программисту права принятия решений, распространяется на высший уровень языка. Scala может использоваться как объектно-ориентированный язык или как чисто функциональный язык.