В этом посте исследуются сходства и различия между неизменяемыми значениями и неизменяемыми ссылками. Состояние неизменяемых значений изменить нельзя. Неизменяемые ссылки - это переменные, которые нельзя переназначить.
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 может использоваться как объектно-ориентированный язык или как чисто функциональный язык.