Tôi muốn bắt đầu bằng sự khác biệt tồn tại trong Scala giữa def, val và var.
def - định nghĩa một bất biến nhãn về nội dung bên phải được uể oải đánh giá - đánh giá theo tên.
val - định nghĩa một bất biến nhãn về nội dung bên phải đó là háo hức/ngay lập tức đánh giá - đánh giá theo giá trị.
var - định nghĩa một biến có thể thay đổi, ban đầu thiết lập để đánh giá nội dung bên phải.
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 trên, nhãn từ def và val không thể được bố trí, và trong trường hợp của bất kỳ nỗ lực một lỗi như dưới đây ai sẽ được nâng lên:
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ư sau:
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
an nhãn không thể thay đổi được tạo cho trường hợp cụ thể đó của Person (tức là 'personA'). Bất cứ khi nào trường có thể thay đổi 'tuổi' cần phải được sửa đổi, nỗ lực đó sẽ không thành công:
như mong đợi, 'tuổi' là một phần của nhãn không thể thay đổi.Các cách chính xác để làm việc về vấn đề này bao gồm trong việc 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 = [email protected]
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
càng rõ ràng, từ tham chiếu biến có thể thay đổi (tức là 'personB') ta có thể sửa đổi các lớp trường có thể thay đổi 'tuổi'.
Tôi vẫn nhấn mạnh sự thậ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.
Câu trả lời này là giải thích rõ ràng nhất. – stackoverflowuser2010