Tôi sẽ bắt đầu bằng sự phân biệt tồn tại trong Scala giữa def , val và var .
def - định nghĩa một nhãn bất biến cho nội dung bên phải được đánh giá một cách lười biếng - đánh giá theo tên.
val - định nghĩa một nhãn bất biến cho nội dung bên phải được đánh giá một cách háo hức / ngay lập tức - được đánh giá theo giá trị.
var - định nghĩa một biến có thể thay đổi , ban đầu được đặt thành nội dung bên phải được đánh giá.
Ví dụ: def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Ví dụ, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Ví dụ, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Theo như trên, các nhãn từ def và val không thể được chỉ định lại và trong trường hợp có bất kỳ lỗi nào như lỗi dưới đây sẽ được đưa ra:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Khi lớp được định nghĩa như:
scala> class Person(val name: String, var age: Int)
defined class Person
và sau đó khởi tạo với:
scala> def personA = new Person("Tim", 25)
personA: Person
một nhãn bất biến được tạo cho trường hợp cụ thể của Người đó (tức là 'personA'). Bất cứ khi nào trường thay đổi 'tuổi' cần được sửa đổi, lần thử đó không thành công:
scala> personA.age = 44
personA.age: Int = 25
như mong đợi, 'tuổi' là một phần của nhãn không thể thay đổi. Cách chính xác để làm việc này bao gồm sử dụng một biến có thể thay đổi, như trong ví dụ sau:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
như rõ ràng, từ tham chiếu biến có thể thay đổi (tức là 'personB'), có thể sửa đổi trường 'tuổi' có thể thay đổi '.
Tôi vẫn sẽ nhấn mạnh thực tế rằng mọi thứ xuất phát từ sự khác biệt đã nêu ở trên, điều đó phải rõ ràng trong tâm trí của bất kỳ lập trình viên Scala nào.
val
có thể được thay đổi nhưng đối tượng được gọi bằng val không thể. Aval
không phải là hằng số.