【发布时间】:2012-11-19 19:56:08
【问题描述】:
在 Scala 中,数组总是按引用传递,按名称调用,对吗?
所以,
def fun(ar: Array[Int]) = {}
等于
def fun(ar: => Array[Int]) = {}
谢谢。
【问题讨论】:
-
不,它们作为按值调用传递。是什么让你这么认为?
-
因为,我有一个名为 fun(v) 的函数 def fun(ar: Array[Int]) = {} 能够修改数组 v。这可能是因为 scala 数组是Java 数组,以及 Java 中的对象是按名称调用的?
-
在 java 中(以及在 scala 中),您通过引用传递所有 objects。您所做的只是传递 reference 的副本,然后使用它(您仍然可以到达内存中的同一对象并对其进行修改,因为引用指向内存中的同一位置)。
-
@om-nom-nom:不,您不通过引用传递对象,无论是在 Scala 还是在 Java 中。 Java 总是按值传递。 Scala 是按值传递的,除了对应于名称参数的参数,它是按名称传递的(但也从不按引用传递)。更准确地说,您总是按值传递指向对象的指针,这有时也称为按对象共享或按共享调用。
-
@om-nom-nom: pass-by-reference 意味着被调用者可以在调用者的范围内修改变量。注意:我不是在谈论修改共享状态。如果调用者和被调用者都有一个指向同一个可变对象的指针,那么该对象的突变对两者都是可见的。但这只是共享的可变状态,与传递引用无关。引用传递意味着被调用者可以修改变量自身,而不仅仅是变量指向的对象。闭包实际上是在Scala中通过引用来捕获变量,在那里你可以看到效果。
标签: arrays scala pass-by-reference