Автоматический геттер и сеттер Scala перезапись с помощью custom =


В scala нет никакой разницы для пользователя класса между вызовом метода или доступом к некоторому полю/члену непосредственно с помощью val x = myclass.свойство myProperty. Чтобы иметь возможность управлять, например, установкой или получением поля, scala позволяет переопределить метод_=. Но действительно ли это метод? Я в замешательстве.

Возьмем следующий код:

class Car(var miles: Int)

var myCar = new Car(10)
println(myCar.miles) //prints 10
myCar.miles = 50
println(myCar.miles) //prints 50

То же самое относится и к этому коду (обратите внимание на двойное пространство в myCar.miles = 50):

class Car(var miles: Int)

var myCar = new Car(10)
println(myCar.miles) //prints 10
myCar.miles  = 50
println(myCar.miles) //still prints 50

Теперь я хочу изменить способ, как miles можно установить или прочитать, например, всегда печатать что-то на экране. Как я могу сделать это так, чтобы пользователи моего класса не пострадали, а также чтобы не было никакой разницы, если пробелы используются перед знаком=?

1 5

1 ответ:

Попробуйте это:

class Car(private var _miles: Int) {
  def miles = _miles
  def miles_=(m: Int): Unit = {
    println("boo")
    _miles = m
  }
}

Пробел не имеет значения. Компилятор видит, что вы назначаете miles, и вставляет вызов miles_= независимо от того, сколько пробелов вы вставляете.