Scala:如何从嵌套类

时间:2018-05-14 18:45:50

标签: scala class

假设我有以下课程:

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究竟是什么意思?

2 个答案:

答案 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的所有引用都是对KMyProg的引用。因此,当您更新K中的UtilityClass时,您会更改KMyProg的值。

我想你想要这个:

var K = MyProg.this.K

现在K中有一个新的UtilityClass,可以在不影响K MyProg的情况下进行更新。通过使用相同的名称,您可以隐藏K的其余内容UtilityClass,并防止其被更改。

当然,有关使用var的警告也适用,因此,如果可能,请寻找一种方法K val。如果Kval,那么您可以直接在UtilityClass中使用它。

相关问题