使用自定义_ =进行Scala自动getter和setter覆盖

val*_*rry 5 getter setter overriding scala class

在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
Run Code Online (Sandbox Code Playgroud)

此代码也是如此(注意双空格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
Run Code Online (Sandbox Code Playgroud)

现在我想改变如何miles设置或读取的方式,例如总是在屏幕上打印一些东西.我怎么能这样做,以便我的类的用户不受影响,并且如果在=符号之前使用空格,它没有任何区别?

Jea*_*let 9

试试这个:

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

空白并不重要.无论您插入多少空格,编译器都会看到您正在分配miles并将插入一个调用miles_=.