1

在 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) = ...
   }
}

在这种情况下,在 and 的实例上调用 when ,myFunc因为默认是按值调用,所以 scala “首先评估参数”。我的困惑是,从这个意义上说,“评估”是对象的复制,还是仅仅是指针。这显然会影响我是否在 for 表达式之前拉出参数。 ParametersContext

4

1 回答 1

2

对象没有被复制,只有指针被复制。

这是一个示例,显示分配的对象在通过一系列函数调用时,始终指向内存中完全相同的对象(内存地址被打印):

def g(o: Object) {
    println(System.identityHashCode(o))
}
def h(o: Object) {
    println(System.identityHashCode(o))
    g(o)
}
h(new Object)

印刷:

1088514451
1088514451

请注意,这与按名称调用完全不同,其中“评估”将在每次调用时分配一个新对象:

def g(o: => Object) {
    println(System.identityHashCode(o))
}
def h(o: => Object) {
    println(System.identityHashCode(o))
    g(o)
}
h(new Object)

印刷:

2144934647
108629940
于 2015-02-21T23:04:00.930 回答