假设我有以下课程:
class MyProg(prop: Int) {
var K = prop
def myFunc() {
class UtilityClass() {
//does stuff that uses K
}
}
}
我希望能够UtilityClass
访问K参数,而不(1)显式传递K,以及(2)不允许MyProg.K值被UtilityClass
内的操作变异。
E.g。我试过了:
class MyProg(prop: Int) {
var K = prop
def myFunc() {
class UtilityClass() {
K = MyProg.this.K
//does stuff that uses K
}
}
}
但是这个(1)似乎作为一个引用传递,并且在K的实用程序类中完成的任何操作现在都会更改MyProg.K值,并且(2)MyProg.this.K
语法不会生成任何意义。
UtilityClass访问K的正确方法是什么? MyProg.this.K
究竟是什么意思?
答案 0 :(得分:2)
当然如果你使用val而不是var,你的问题就解决了,对吗?
所以我假设你需要将该字段作为类中的可变变量。
您可以使用访问修饰符private
来阻止对变量的外部操作,并定义使用公共getter,以便其他类可以访问它的值:
class MyProg(prop: Int) {
private var _K = prop
def K = _K
}
val peekAtK = new MyProg(4).K
//> peekAtK : Int = 4
private修饰符禁止所有其他类访问变量,但是,嵌套类存在于同一个词法范围中,并且它始终能够访问字段K.
答案 1 :(得分:1)
问题在于这一行:
K = MyProg.this.K
这没有做任何事情,只是将K
重新分配给自己。 K
内对UtilityClass
的所有引用都是对K
中MyProg
的引用。因此,当您更新K
中的UtilityClass
时,您会更改K
中MyProg
的值。
我想你想要这个:
var K = MyProg.this.K
现在K
中有一个新的UtilityClass
,可以在不影响K
MyProg
的情况下进行更新。通过使用相同的名称,您可以隐藏K
的其余内容UtilityClass
,并防止其被更改。
当然,有关使用var
的警告也适用,因此,如果可能,请寻找一种方法K
val
。如果K
是val
,那么您可以直接在UtilityClass
中使用它。