Scala:对象引用可以通过嵌套函数吗?

时间:2015-02-21 23:01:53

标签: scala scalac

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

在这种情况下,在myFuncParameters的实例上调用Context时,由于默认值是按值调用,因此scala&#34;首先评估参数&#34 ;。我的困惑在于是否评估&#34;从这个意义上说,就是复制对象,或只是指针。这显然会影响我是否在for表达式之前拉出参数。

1 个答案:

答案 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