Class Scala自动getter和setter覆盖自定义_=

Class Scala自动getter和setter覆盖自定义_=,class,scala,overriding,setter,getter,Class,Scala,Overriding,Setter,Getter,在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) //prin

在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(private var _miles: Int) {
  def miles = _miles
  def miles_=(m: Int): Unit = {
    println("boo")
    _miles = m
  }
}

空白并不重要。编译器看到您正在分配
miles
,并将插入对
miles
的调用,无论您插入多少空格。

这是否意味着,如果我声明了一个名为miles=且名为miles的方法,那么miles=不是名称,而是由scala专门解释的,其中mil\es是一个常规函数名(where_u没有特殊意义)?如果是,那意味着我不能创建MyClass。something_u=()方法,因为u已被解释为u的任何正数。我不确定我是否理解你的问题。只有
\uu=
后缀有特殊含义。你也可以用全名调用
miles\u=
方法-它看起来很难看。@Jean Phillippe Pellet,这意味着我无法为
miles=
创建不同的方法nd
miles\uz=
所以名称空间是受限的。我只是想确保我做对了。还是不明白你的意思。这是如何“限制名称空间”的?因为不能在每个位置上使用所有允许的字符作为方法名称,使每个方法都有不同的行为。这当然不实用,但在我看来也不是很复杂。
class Car(private var _miles: Int) {
  def miles = _miles
  def miles_=(m: Int): Unit = {
    println("boo")
    _miles = m
  }
}