1

在 Scala 中,数组总是按引用传递,按名称调用,对吗?

所以,

def fun(ar: Array[Int]) = {}

等于

def fun(ar: => Array[Int]) = {}

谢谢。

4

2 回答 2

8

在 Scala 中,数组总是按引用传递,按名称调用,对吗?

不。在 Scala 中,就像在 Java、C、C++(默认)、C#(默认)、Smalltalk、Ruby、Python 以及几乎所有其他曾经创建的面向对象语言中一样,参数是按值传递的。

可以显式声明一个按名称参数,然后(但仅在那时)与该参数对应的参数将按名称传递。Scala永远不会通过引用传递。

所以,

def fun(ar: Array[Int]) = {}

等于

def fun(ar: => Array[Int]) = {}

不它不是。在第一种情况下,数组(或者更确切地说是指向数组的指针)将按值传递,在第二种情况下按名称传递。在这两种情况下都不会通过引用传递。

于 2012-11-19T20:57:42.993 回答
0

为了进一步澄清,维基百科的以下引用可能会有所帮助:

但是,“共享呼叫”一词并不常用。不同来源的术语不一致。例如,在 Java 社区中,他们说 Java 是按值传递的,而在 Ruby 社区中,他们说 Ruby 是按引用传递的,尽管这两种语言表现出相同的语义。

对于 C++ 程序员,面对 Scala/Java 使用的术语,恕我直言,有两点可能会导致混淆:

  • C++ 程序员将按值传递解释为“调用了复制构造函数”,这意味着调用者可以在不修改被调用者实例的情况下改变传递的对象。Scala/Java 并非如此。当 Java 程序员声称Java 是按值调用时,我总是将其翻译成“对象引用是按值传递的”。
  • 对象的可能修改类似于 C++ 的引用参数(调用者对相同的实例进行操作)。从这个角度来看,我们可以得出结论,Scala 使用了引用调用。但是通过引用调用是由传递参数的可能重新分配定义的。这在 Scala 中是不可能的。由于评估策略既不是(类似 C++ 的)按值传递也不是按引用传递,我认为术语传递共享是最合适的。
于 2012-11-20T10:36:54.387 回答