Saya akan mulai dengan perbedaan yang ada di Scala antara def , val dan var .
def - mendefinisikan label abadi untuk konten sisi kanan yang malas dievaluasi - mengevaluasi dengan nama.
val - mendefinisikan label permanen untuk konten sisi kanan yang bersemangat / segera dievaluasi - dievaluasi oleh nilai.
var - mendefinisikan variabel yang dapat diubah , yang awalnya diatur ke konten sisi kanan yang dievaluasi.
Contoh, def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Contoh, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Contoh, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Menurut di atas, label dari def dan val tidak dapat dipindahkan, dan jika ada kesalahan seperti di bawah ini akan muncul:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Ketika kelas didefinisikan seperti:
scala> class Person(val name: String, var age: Int)
defined class Person
dan kemudian dipakai dengan:
scala> def personA = new Person("Tim", 25)
personA: Person
label yang tidak dapat diubah dibuat untuk instance spesifik Person (yaitu 'personA'). Kapan pun 'usia' bidang yang dapat diubah perlu diubah, upaya tersebut gagal:
scala> personA.age = 44
personA.age: Int = 25
seperti yang diharapkan, 'usia' adalah bagian dari label yang tidak dapat diubah. Cara yang benar untuk mengerjakan ini terdiri dari menggunakan variabel yang bisa berubah, seperti dalam contoh berikut:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
sejelas itu, dari referensi variabel yang bisa berubah-ubah (yaitu 'personB') dimungkinkan untuk memodifikasi bidang 'kelas' yang bisa berubah-ubah kelas.
Saya masih akan menekankan fakta bahwa semuanya berasal dari perbedaan yang disebutkan di atas, yang harus jelas dalam pikiran setiap programmer Scala.
val
dapat diubah tetapi objek yang dirujuk oleh val tidak bisa. Aval
bukan konstanta.