【问题标题】:Every "setter" method requires a "getter" method in Scala?Scala 中的每个“setter”方法都需要一个“getter”方法吗?
【发布时间】:2023-03-09 07:11:01
【问题描述】:

Scala 程序员应该知道这种写法:

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 

谁能解释为什么?

【问题讨论】:

  • 您对Person 的两个定义并不完全相同,因为第二个定义也会为_id 生成私有getter 和setter 方法。

标签: scala syntax setter getter


【解决方案1】:

编译器之所以如此,是因为规范是这么说的。

请参阅Scala Reference,第 1 页。 86, §6.15 作业。

请注意,没有什么能阻止您:

  • 制作吸气剂private
  • 让 getter 返回另一种类型
  • 使 getter “不可调用”,例如像这样:def id(implicit no: Nothing)

【讨论】:

  • 你的回答让我开心:-)
  • 我看不出规范的这一部分需要一个 getter 才能让 setter 工作。你(或其他人)能解释一下吗?
  • “如果x是在某个模板中定义的无参数函数,并且同一个模板包含一个setter函数x_=作为成员,那么赋值x = e被解释为调用x_=(e)那个setter函数。”这要求x 是一个无参数函数。
  • 其实至少在2.10.4上,getter不能是私有的。不过,第三个技巧 (implicit no: Nothing) 有效。
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2017-09-09
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多