Zacząłbym od rozróżnienia istniejącego w Scali między def , val i var .
def - definiuje niezmienną etykietę dla zawartości po prawej stronie, która jest leniwie oceniana - oceniana według nazwy.
val - definiuje niezmienną etykietę dla treści po prawej stronie, która jest chętnie / natychmiast oceniana - oceniana według wartości.
var - definiuje zmienną modyfikowalną , początkowo ustawioną na wartościowaną zawartość po prawej stronie.
Przykład, pok
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Przykład, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Przykład, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Zgodnie z powyższym, etykiet z def i val nie można ponownie przypisać, aw przypadku jakiejkolwiek próby podniesiony zostanie błąd podobny do poniższego:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Gdy klasa jest zdefiniowana w następujący sposób:
scala> class Person(val name: String, var age: Int)
defined class Person
a następnie utworzono za pomocą:
scala> def personA = new Person("Tim", 25)
personA: Person
niezmienne etykieta jest tworzony dla tej instancji konkretnej osoby (czyli „Persona”). Za każdym razem, gdy zmienne pole „age” wymaga modyfikacji, taka próba kończy się niepowodzeniem:
scala> personA.age = 44
personA.age: Int = 25
zgodnie z oczekiwaniami „wiek” jest częścią niezmiennej etykiety. Prawidłowy sposób pracy polega na zastosowaniu zmiennej mutowalnej, jak w poniższym przykładzie:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
co oczywiste, z odniesienia do zmiennej mutowalnej (tj. „personB”) można zmodyfikować pole mutable class „age”.
Podkreśliłbym jeszcze fakt, że wszystko bierze się z podanej powyżej różnicy, o której każdy programista Scala musi sobie jasno uświadomić.
val
można zmienić stan wewnętrzny a, ale obiekt, do którego odwołuje się wartość, nie może. Aval
nie jest stałą.