Scala,class 使用可变变量,在覆盖方法中更新
Scala, class using mutable var, update in overriding method
我很难理解如何让下面的代码结构工作。
在 Scala 中,我有一个 class MyClass
继承自 SomeClass
我在这种情况下添加了一个 var
成员变量,称为 mutableArray
它是在重写方法 overridingSomeClassMethod
中更新,并在我立即多次创建 MyClass
的新实例时调用。但是在 main
中,当我尝试获取更新的 mutableArray
变量时,它会打印出实例化的 var
,就好像它是不可变的或仅在覆盖方法中具有作用域一样。
我无法更改父 SomeClass
中的方法,我尝试创建一个伴生对象并将变量放入 SomeOtherObject
中,但我遇到了完全相同的问题。
import scala.collection.mutable.ArrayBuffer
object SomeOtherObject{
case MyClass(...) extends SomeClass(..){
var mutableArray: ArrayBuffer[Int] = ArrayBuffer.fill(5)(0)
def overridingSomeClassMethod(...){
var someReturnVar = 0.0
mutableArray(0) += 1
println(mutableArray.mkString) // last output -> 84169
someReturnVar
}
}
def main(args: Array[String]){
var mc = new MyClass
println(mc.mutableArray.mkString) // output -> 00000
}
}
可能您遇到了臭名昭著的 "one question FAQ" 关于初始化顺序的问题。
如果该方法由超类构造函数调用,那么您的初始化会在这之后发生,将数据重置为零。
您可以使用 early initializer:
case MyClass(...) extends {
var mutableArray: ArrayBuffer[Int] = ArrayBuffer.fill(5)(0)
} with SomeClass(..) {
我很难理解如何让下面的代码结构工作。
在 Scala 中,我有一个 class MyClass
继承自 SomeClass
我在这种情况下添加了一个 var
成员变量,称为 mutableArray
它是在重写方法 overridingSomeClassMethod
中更新,并在我立即多次创建 MyClass
的新实例时调用。但是在 main
中,当我尝试获取更新的 mutableArray
变量时,它会打印出实例化的 var
,就好像它是不可变的或仅在覆盖方法中具有作用域一样。
我无法更改父 SomeClass
中的方法,我尝试创建一个伴生对象并将变量放入 SomeOtherObject
中,但我遇到了完全相同的问题。
import scala.collection.mutable.ArrayBuffer
object SomeOtherObject{
case MyClass(...) extends SomeClass(..){
var mutableArray: ArrayBuffer[Int] = ArrayBuffer.fill(5)(0)
def overridingSomeClassMethod(...){
var someReturnVar = 0.0
mutableArray(0) += 1
println(mutableArray.mkString) // last output -> 84169
someReturnVar
}
}
def main(args: Array[String]){
var mc = new MyClass
println(mc.mutableArray.mkString) // output -> 00000
}
}
可能您遇到了臭名昭著的 "one question FAQ" 关于初始化顺序的问题。
如果该方法由超类构造函数调用,那么您的初始化会在这之后发生,将数据重置为零。
您可以使用 early initializer:
case MyClass(...) extends {
var mutableArray: ArrayBuffer[Int] = ArrayBuffer.fill(5)(0)
} with SomeClass(..) {