问题描述
在scala中,类的用户在调用方法或直接使用val x = myclass.myproperty访问某些字段/成员之间没有区别.为了能够控制例如设置或获取字段时,scala让我们覆盖_ =方法.但是=真的是一种方法吗?我很困惑.
In scala there is no difference for the user of a class between calling a method or accessing some field/member directly using val x = myclass.myproperty. To be able to control e.g. setting or getting a field, scala let us override the _= method. But is = really a method? I am confused.
让我们采用以下代码:
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
中的双倍空格):
Same goes for this code (notice the double space in 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
的设置或读取方式,例如总是在屏幕上打印一些东西.如何做到这一点,以使班级的用户不受影响,并且如果在=号之前使用空格,也不会造成任何影响?
Now i want to change the way how the miles
can be set or read, e.g. always printing something on the screen. How can i do this so that the users of my class are not affected and also so that it does not make any difference if whitespaces are used before the = sign?
推荐答案
尝试一下:
class Car(private var _miles: Int) {
def miles = _miles
def miles_=(m: Int): Unit = {
println("boo")
_miles = m
}
}
空格不重要.编译器会看到您正在分配miles
,并且无论您插入多少空格,都将插入对miles_=
的调用.
Whitespace is not significant. The compiler sees you're assigning miles
and will insert a call to miles_=
no matter how many spaces you insert.
这篇关于使用自定义_ =的Scala自动getter和setter覆盖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!