在Scala中,一个指向对象的指针,而不是对象本身。那么说,将对象指针传递给嵌套函数没有问题,如下所示,即不会分配对象层?
case class Parameters(name: String, id: String, values: Array[Double])
case class Context(id: String, a: Double, b: Double, c: Double)
和
def myFunc(par: Parameters, ctx: Context): Unit = {
//..do stuff
for (i<- 1 to ITERATIONS) {
otherFunctions.resolve(par, ctx)
}
object otherFunctions {
def resolve(params: Parameters, ctx: Context): Unit = {
//do more ...
val x: Int = {...}
calculate(params.values, ctx.a, ctx.b, x)
}
def calculate(array: Array[Double], b: Double, c: Double, x: Int) = ...
}
}
在这种情况下,在myFunc
和Parameters
的实例上调用Context
时,由于默认值是按值调用,因此scala&#34;首先评估参数&#34 ;。我的困惑在于是否评估&#34;从这个意义上说,就是复制对象,或只是指针。这显然会影响我是否在for表达式之前拉出参数。
答案 0 :(得分:2)
不复制对象,只有指针。
这是一个示例,显示分配的对象在通过一系列函数调用时,始终指向内存中的完全相同的对象(内存地址被打印):
def g(o: Object) {
println(System.identityHashCode(o))
}
def h(o: Object) {
println(System.identityHashCode(o))
g(o)
}
h(new Object)
打印:
1088514451
1088514451
请注意,这与call-by-name完全不同,其中“evaluate”将在每次调用时分配一个新对象:
def g(o: => Object) {
println(System.identityHashCode(o))
}
def h(o: => Object) {
println(System.identityHashCode(o))
g(o)
}
h(new Object)
打印:
2144934647
108629940