Подтвердить что ты не робот

Scala: не удается записать сеттер без геттера?

Это работает:

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

Можно ли создать сеттер (с синтаксическим сахаром) без геттера?

4b9b3361

Ответ 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
}