Scala'da def , val ve var arasındaki ayrımla başlıyorum .
def - tembel olarak değerlendirilen sağ taraf içeriği için değişmez bir etiket tanımlar - isme göre değerlendirir.
val - sağ taraftaki içerik için hevesle / hemen değerlendirilen - değere göre değerlendirilen değişmez bir etiket tanımlar .
var - başlangıçta değerlendirilen sağ taraf içeriğine ayarlanan değişken bir değişkeni tanımlar .
Örnek, def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Örnek, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Örnek, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Yukarıdakilere göre, def ve val'dan etiketler yeniden atanamaz ve herhangi bir deneme durumunda aşağıdaki gibi bir hata ortaya çıkar:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Sınıf şu şekilde tanımlandığında:
scala> class Person(val name: String, var age: Int)
defined class Person
ve sonra aşağıdakilerle somutlaştırılır:
scala> def personA = new Person("Tim", 25)
personA: Person
Bir değişmez etiket Kişinin bu özel örneği (yani 'persona') oluşturulur. Değişken 'yaş' alanının değiştirilmesi gerektiğinde, bu girişim başarısız olur:
scala> personA.age = 44
personA.age: Int = 25
beklendiği gibi, 'yaş' değiştirilemez bir etiketin parçasıdır. Bunun üzerinde çalışmanın doğru yolu, aşağıdaki örnekte olduğu gibi değiştirilebilir bir değişken kullanmaktır:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
açık bir şekilde, değişken değişken referansından (yani 'personB') sınıf değişebilen 'yaş' alanını değiştirmek mümkündür.
Yine de her şeyin yukarıda belirtilen farktan geldiğini, herhangi bir Scala programcısını akılda tutması gerektiğini vurguluyorum.
val
değiştirilebilir, ancak val tarafından atıfta bulunulan nesne değiştirilemez. Aval
sabit değildir.