2012-04-06 25 views
6

Scala lập trình viên phải biết rằng loại này viết:Mọi phương thức "setter" đều yêu cầu phương thức "getter" trong Scala?

class Person{ 
    var id = 0 
} 
var p = new Person 
p.id 
p.id = 2  

tương đương với

class Person{ 
private var _id = 0 
def id = _id 
def id_=(i: Int) = _id = i 
} 
val p = new Person 
p.id // be equal to invoke id method of class Person 
p.id = 2 // be equal to p.id_=(2) 

có hiệu lực. Nhưng nếu bạn nhận xét phương pháp getter def id = _id, p.id = 2 sẽ gây ra một lỗi biên dịch, nói

error: value key is not a member of Person 

bất cứ ai có thể giải thích tại sao?

+0

Hai định nghĩa 'Person' của bạn không chính xác tương đương, vì định nghĩa thứ hai cũng sẽ tạo ra phương thức getter và setter riêng cho' _id'. –

Trả lời

8

Trình biên dịch là như vậy bởi vì đặc điểm kỹ thuật nói như vậy.

Xem Scala Reference, tr. 86, §6.15 Bài tập.

Lưu ý rằng không có gì ngăn cản bạn từ:

  • làm cho getter private
  • khiến sự trở lại getter một loại
  • làm cho getter “uncallable”, ví dụ như thế này: def id(implicit no: Nothing)
+0

câu trả lời của bạn làm cho tôi hạnh phúc :-) –

+0

Tôi không thể thấy phần này của spec yêu cầu một getter để setter hoạt động như thế nào. Bạn có thể (hoặc bất kỳ ai khác) giải thích? –

+1

“Nếu' x' là một hàm không tham số được định nghĩa trong một số mẫu, và cùng một mẫu chứa hàm setter 'x_ =' là thành viên, thì phép gán 'x = e' được hiểu là lời gọi' x _ = (e) ' của hàm setter đó. ”Điều này đòi hỏi' x' là một hàm không tham số. –

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