2012-04-06 39 views
6

斯卡拉程序员应该已经知道,这种写作:每个“setter”方法都需要在Scala中使用“getter”方法吗?

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

等于

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) 

生效。但是,如果你对此有何评论getter方法def id = _idp.id = 2会导致编译错误,说

error: value key is not a member of Person 

谁能解释一下为什么?

+0

'Person'的两个定义并不完全相同,因为第二个定义也会为'_id'生成私有getter和setter方法。 – 2012-04-06 08:44:41

回答

8

编译器是如此,因为规范说明如此。

查看Scala Reference,p。 86,§6.15作业。

请注意,这不影响您:

  • 使得吸气private
  • 使得吸气返回另一个类型
  • 使得吸气“uncallable”,例如像这样:def id(implicit no: Nothing)
+0

你的答案让我开心:-) – 2012-04-06 08:43:05

+0

我看不出这部分规范需要一个吸气器才能让setter工作。你可以(或其他人)解释吗? – 2012-04-07 16:33:53

+1

“如果'x'是一个模板中定义的无参数函数,并且同一个模板包含一个setter函数'x_ ='作为成员,则赋值'x = e'被解释为调用'x _ =(e)'该设置函数“。这需要'x'是一个无参数函数。 – 2012-04-08 16:09:23