Scala: «переназначение в val» x, но x - это var - PullRequest
0 голосов
/ 30 июня 2018

У меня есть следующий кусок кода

class A(var x: Int, var y: Int){

}

class B(x: Int, y: Int) extends A(x,y){

    def setX(xx: Int): this.type = {
        this.x = xx
        this
    }
}

но выдает следующую ошибку:

error: reassignment to val this.x = xx ^

Я не знаю, что происходит, поскольку x и y должны быть переменными. Какой правильный способ сделать это?

1 Ответ

0 голосов
/ 30 июня 2018

Произошло столкновение имен переменных-членов с именами аргументов конструктора.

Очевидный обходной путь компилируется просто отлично:

class A(var x: Int, var y: Int)

class B(cx: Int, cy: Int) extends A(cx, cy) {

    def setX(xx: Int): this.type = {
        this.x = xx
        this
    }
}

Проблема, кажется, не нова, вот ссылка на запись форума от 2009 . Он имеет сообщение с буквально с тем же сообщением об ошибке в той же ситуации .

Основная причина в том, что аргументы конструктора могут автоматически преобразовываться в частные val s, поскольку на них можно ссылаться из методов объекта:

class B(cx: Int, cy: Int) {
  def foo: Int = cx
}
...