Проблема с геттерами / сеттерами Scala - PullRequest
9 голосов
/ 07 июля 2011

В настоящее время я изучаю Scala и только что обнаружил способ создания пользовательских методов получения / установки полей. У меня есть простой пример работы:

class Thing(private val a:Int){
  override def toString = "Thing[" + a + "]"
  private var _value = a
  def value = _value
  def value_= (newVal:Int) = _value = newVal
}

На консоли я могу сделать:

scala> var t = new Thing(2)
t: dylan.code.Thing = Thing[2]

scala> t.value
res1: Int = 2

scala> t.value = 3

scala> t.value
res2: Int = 3

Теперь я пытаюсь привести эту концепцию к чуть более сложному примеру; Я постараюсь свести код к тому, что имеет отношение:

abstract class CellExpression[Type] extends Publisher[CellUpdateEvent[Type]] with Subscriber[CellUpdateEvent[Type], CellExpression[Type]]{
    protected var cachedValue: Type = recalculateValue() 
    protected def recalculateValue(): Type

    protected def changeValue(newValue: Type):Unit = {
        val oldValue = value()
        if(newValue != oldValue){
            cachedValue = newValue
            publish(new CellUpdateEvent(this, oldValue, newValue))
        }
    }

    def value() = cachedValue
    def notify(pub: CellExpression[Type], event: CellUpdateEvent[Type]) = changeValue(recalculateValue())
}
//....
class CellVariable[Type](private val initialValue:Type) extends CellExpression[Type]{
    cachedValue = initialValue
    protected def recalculateValue() = { cachedValue }
    override def toString = "CellVariable[" + value + "]"
    def value_= (newValue:Type) = {changeValue(newValue)}
}

Насколько я могу судить, я сделал то, что мне нужно, чтобы иметь возможность обрабатывать value как поле через его метод получения и установки. Но когда я пробую это в консоли, я получаю:

scala> var i = new CellVariable(2)
i: dylan.code.CellVariable[Int] = CellVariable[2]

scala> i.value = 3
<console>:11: error: reassignment to val
       i.value = 3
               ^

Что я сделал не так и как я могу это исправить?

Ответы [ 2 ]

11 голосов
/ 07 июля 2011

Я действительно наткнулся на решение.

Строка, в которой я объявляю свою функцию значения: def value() = cachedValue - виновник. Если я уберу скобки, чтобы сделать строку def value = cachedValue, все будет работать так, как я ожидал.

0 голосов
/ 07 июля 2011

Вы не можете изменять значения в Scala.Значение присваивается один раз и только один раз.Если вы хотите сделать это, вам нужно использовать переменные вместо значений.Другими словами, измените объявление с val на var.

Проблема в одном из ваших определений классов и может быть в строке без val, потому что я считаю, что если вы пренебрегаете объявитьимя, тогда Scala предполагает, что это значение и, следовательно, неизменяемое.

Хотя вы не уверены, для чего нужны геттеры и сеттеры.Scala позволяет вам игнорировать все эти издержки Java.

Вероятно, это строка, которая говорит cachedValue = initialValue, потому что она не объявлена ​​с var где-либо в этом классе.Определение в другом классе - это другое имя, потому что оно находится в другой области видимости.Вам нужно будет сказать что-то вроде class.varname, чтобы изменить переменную, определенную в другом классе.

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