2016-04-11 11 views
6

Trong một cuộc phỏng vấn gần đây tôi đã có với một công ty phần mềm khá uy tín, tôi đã vấp phải cố gắng cung cấp một lời giải thích hợp lý cho một câu hỏi Scala dường như tầm thường. Hãy xem xét những điều sau đây:Điều gì sẽ xảy ra với một phép gán biến khi tôi gọi một phương thức trả về một cá thể của một lớp chữ thường giữ biến được nói?

case class Person(var age: Int) 
def person = new Person(10) 
person.age = 3 
println(person) 

Đây là những gì được trả về bởi các println tuyên bố:

Person(10) 

Câu hỏi đặt ra là tại sao điều này và những gì đang xảy ra khi tôi gán 3-person.age?

+1

Câu trả lời hay nhất có lẽ là: "chỉ không sử dụng các vars trong một lớp chữ". –

Trả lời

7

Vâng,

def person = new Person(10) 

là một hàm. Tức là, mỗi khi bạn gọi person, bạn tạo một phiên bản mới của Person. Do đó, nếu chúng tôi nội dòng chức năng, mã của bạn sẽ trông giống như:

Person(10).age = 3 
println(Person(10)) 

Nếu bạn muốn thay đổi tuổi của cá thể bạn đã tạo đầu tiên, bạn cần nắm bắt trường hợp đó.

val p = person 
p.age = 3 
println(p) 
8

Đối với điều này, bạn cần hiểu sự khác biệt giữa valdef.

Khi bạn sử dụng def cho bất kỳ biểu thức nào, nó được đánh giá mỗi khi nó được sử dụng. Vì vậy, trong trường hợp này khi bạn thực hiện person.age = 3 Nó sẽ tạo một đối tượng mới của đối tượng người và gán 3 cho độ tuổi của nó, và khi bạn làm println(person) nó sẽ tạo lại một lớp người mới và do đó nó in Person(10).

Vì vậy, Nếu bạn có val thay vì def như thế này: val person = new Person(10) và làm

person.age = 3 
println(person) 

đầu ra sẽ là: Person(3) vì, val được đánh giá một lần. Vì vậy, sẽ chỉ có một trường hợp person trong trường hợp này bất kể số lần bạn sử dụng person.

Các vấn đề liên quan