zacząłbym od różnicy, jaka istnieje w Scala między def, val i var.
def - definiuje niezmienny etykietę na prawej bocznej zawartości, która jest leniwie ocenianego - oceniać według nazwy.
Val - określa niezmienny etykietę na prawej stronie zawartości, która jest chętnie/bezpośrednio oceniany - ocenia wartości.
var - definiuje zmienny zmienną, początkowo ustawiony na ocenianym prawej bocznej treści.
Przykład Def
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, zmienna
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Według wyżej, etykiety z def i val nie może być przeniesiony, a w przypadku jakiejkolwiek próby błąd jak poniżej jednego zostaną podniesione:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Kiedy klasa jest zdefiniowana następująco:
scala> class Person(val name: String, var age: Int)
defined class Person
i tworzony z:
scala> def personA = new Person("Tim", 25)
personA: Person
an niezmienna etykieta jest tworzona dla tej konkretnej instancji Osoby (tj. 'osoba'). Ilekroć „wiek” polu Zmienna musi być zmodyfikowana, taka próba nie powiedzie się:
scala> personA.age = 44
personA.age: Int = 25
zgodnie z oczekiwaniami, „wiek” jest częścią non-zmienny etykiecie.Prawidłowy sposób do pracy na tym polega na użyciu zmiennej zmienny, jak w poniższym przykładzie:
scala> var personB = new Person("Matt", 36)
personB: Person = [email protected]
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
jako przezroczysty, z zmienny sygnał sterujący (IE personB "), możliwe jest modyfikowanie klasę zmienne pole "wiek".
Nadal podkreślam fakt, że wszystko pochodzi od wyżej opisanej różnicy, co musi być jasne dla każdego programisty Scala.
Ta odpowiedź jest najwyraźniejszym wyjaśnieniem. – stackoverflowuser2010