Scala:对象引用可以通过嵌套函数吗?
Scala: Can object Reference pass through nested functions?
在 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) = ...
}
}
在这种情况下,当在 Parameters
和 Context
的实例上调用 myFunc
时,因为默认是按值调用,scala "evaluates the parameters first"。我的困惑是 "evaluated" 在这个意义上是对象的复制,还是只是指针。这显然会影响我是否在 for 表达式之前提取参数。
不复制对象,只复制指针。
这是一个示例,显示分配的对象在通过一系列函数调用时始终指向内存中完全相同的对象(打印内存地址):
def g(o: Object) {
println(System.identityHashCode(o))
}
def h(o: Object) {
println(System.identityHashCode(o))
g(o)
}
h(new Object)
打印:
1088514451
1088514451
请注意,这与按名称调用完全不同,其中 "evaluation" 每次调用时都会分配一个新对象:
def g(o: => Object) {
println(System.identityHashCode(o))
}
def h(o: => Object) {
println(System.identityHashCode(o))
g(o)
}
h(new Object)
打印:
2144934647
108629940
在 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) = ...
}
}
在这种情况下,当在 Parameters
和 Context
的实例上调用 myFunc
时,因为默认是按值调用,scala "evaluates the parameters first"。我的困惑是 "evaluated" 在这个意义上是对象的复制,还是只是指针。这显然会影响我是否在 for 表达式之前提取参数。
不复制对象,只复制指针。
这是一个示例,显示分配的对象在通过一系列函数调用时始终指向内存中完全相同的对象(打印内存地址):
def g(o: Object) {
println(System.identityHashCode(o))
}
def h(o: Object) {
println(System.identityHashCode(o))
g(o)
}
h(new Object)
打印:
1088514451
1088514451
请注意,这与按名称调用完全不同,其中 "evaluation" 每次调用时都会分配一个新对象:
def g(o: => Object) {
println(System.identityHashCode(o))
}
def h(o: => Object) {
println(System.identityHashCode(o))
g(o)
}
h(new Object)
打印:
2144934647
108629940