Ответ 1
Спецификация требует, чтобы как сеттер, так и геттер были определены, чтобы иметь возможность использовать синтаксический сахар для вызова сеттера:
Интерпретация присвоения простая переменная x = e зависит от определение х. Если х обозначает изменяемая переменная, тогда назначение изменяет текущее значение x на результат оценки выражение e. Тип e является как ожидается, будет соответствовать типу x. Если x - функция без параметров определенные в некотором шаблоне, и то же самое шаблон содержит функцию setter x_ = как член, то присваивание x = e интерпретируется как вызов x _ = (e) этой функции setter.Аналогично, присваивание f.x = e to безпараметрическая функция x равна интерпретируется как вызов f.x _ = (e). Задание f (args) = e с функции слева от оператор '= интерпретируется как f.update(args, e), то есть вызов функции обновления, определяемой параметром f.
Кроме того, геттер должен быть видимым, чтобы использовать установщик. Я не уверен, что это указано
Getter не отображается # 1
// 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
}
Getter не отображается # 2
//<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
}