Scala: нельзя писать сеттер без геттера - PullRequest
25 голосов
/ 15 марта 2010

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

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

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

Ответы [ 2 ]

29 голосов
/ 15 марта 2010

Спецификация требует, чтобы и установщик, и получатель были определены, чтобы иметь возможность использовать синтаксический сахар для вызова установщика:

Интерпретация задания простая переменная x = e зависит от определение х. Если х обозначает изменяемая переменная, затем присваивание изменяет текущее значение х на результат оценки выражение е. Тип е есть ожидается, чтобы соответствовать типу х. Если х - функция без параметров определенный в некотором шаблоне, и тот же шаблон содержит функцию установки x_ = как член, то назначение x = е интерпретируется как вызов x _ = (e) этой установочной функции. Аналогично, присваивание f .x = e функция без параметров х интерпретируется как вызов f .x _ = (e ). Назначение f (args) = e с применение функции слева от оператор ‘=’ интерпретируется как f .update (args, e), то есть вызов функции обновления, определенной f.

Кроме того, геттер должен быть виден, чтобы использовать его. Я не уверен, указано ли это

Геттер не виден # 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
}

Геттер не виден # 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
}
0 голосов
/ 18 января 2018

Как указывал ретроним, должен быть настоящий геттер. Однако в качестве обходного пути (если вы не хотите предоставлять получатель), вы можете вернуть получатель 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
}

Не думайте, что это считается хорошим стилем (!), Но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...