这有效:
class ButtonCountObserver {
private var cnt = 0 // private field
def count = cnt // reader method
def count_=(newCount: Int) = cnt = newCount // writer method
// ...
}
val b = new ButtonCountObserver
b.count = 0
但这不是
class ButtonCountObserver {
private var cnt = 0 // private field
def count_=(newCount: Int) = cnt = newCount // writer method
// ...
}
val b = new ButtonCountObserver
b.count = 0
我得到:error: value count is not a member of ButtonCountObserver
是否可以在没有吸气剂的情况下创建一个具有语法糖的setter?
答案 0 :(得分:29)
规范要求setter和getter都被定义为能够使用语法糖来调用setter:
对作业的解释 一个简单的变量x = e取决于 x的定义。如果x表示a 可变变量,然后是赋值 将x的当前值更改为 评估结果 表达e的类型是 期望符合x的类型。 如果x是无参数函数 在某些模板中定义,并且相同 模板包含一个setter函数 x_ =作为成员,然后赋值x = e被解释为调用 x _ =(e)该setter函数。 类似地,赋值f .x = e到 无参数函数x是 解释为调用f .x _ =(e )。赋值f(args)= e with a 函数应用程序左侧 '='运算符被解释为f .update(args,e),即调用 由f。
定义的更新函数
此外,为了使用setter,必须可见getter。我不确定这是否已指定
// error: method x cannot be accessed in x.Test
object x {
class Test {
private[this] var x0: Int = 0
private[Test] def x = x0
def x_=(a: Int) = x0 = a
}
val t = new Test
t.x = 1
}
//<console>:11: error: type mismatch; found : x.Test required: ?{val x: ?}
object x {
class Test {
private[this] var x0: Int = 0
private[this] def x = x0
def x_=(a: Int) = x0 = a
}
val t = new Test
t.x = 1
}
object x {
class Test {
private[this] var x0: Int = 0
private[x] def x = x0
def x_=(a: Int) = x0 = a
}
val t = new Test
t.x = 1
}
答案 1 :(得分:0)
正如反语所指出的,必须有吸气剂存在。然而,作为一种解决方法(如果你不想提供一个吸气剂),你可以让getter返回Unit
object x {
class Test {
private[this] var x0: Int = 0
def x: Unit = ()
def x_=(a: Int) = x0 = a
}
val t = new Test
t.x = 1
}
不要认为这被认为是好的风格(!),但它确实有效。