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 など、これまでに作成されたほとんどすべてのオブジェクト指向言語と同様に、引数は値によって渡されます。

by-name-parameterを明示的に宣言すると、(その場合のみ) そのパラメーターに対応する引数が名前で渡されます。Scala は決して参照渡しをしません。

そう、

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

に等しい

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

いいえそうではありません。最初のケースでは、配列 (または配列へのポインター) は値で渡され、2 番目のケースでは名前で渡されます。どちらの場合も、参照によって渡されません。

于 2012-11-19T20:57:42.993 に答える
0

さらに明確にするために、ウィキペディアからの次の引用が役立つかもしれません:

ただし、「共有による呼び出し」という用語は一般的に使用されていません。用語は、さまざまなソース間で一貫性がありません。たとえば、Javaコミュニティでは、Javaは値渡しであると言われていますが、Rubyコミュニティでは、2つの言語が同じセマンティクスを示していても、Rubyは参照渡しであると言われています。

C ++プログラマーの場合、Scala / Javaで使用される用語に直面すると、混乱を招く可能性のある2つのポイントがあります。

  • C ++プログラマーは、値渡しを「コピーコンストラクターが呼び出される」と解釈します。これは、呼び出し元が、呼び出し先のインスタンスを変更せずに、渡されたオブジェクトを変更できることを意味します。これはScala/Javaには当てはまりません。JavaプログラマーがJavaが値による呼び出しであると主張するとき、私は常にこれを「オブジェクト参照は値によって渡される」と翻訳します。
  • オブジェクトの可能な変更は、C ++の参照引数に似ています(呼び出し元は同じインスタンスで動作します)。この観点から、Scalaは参照による呼び出しを使用していると結論付けることができます。ただし、参照による呼び出しは、渡された引数の可能な再割り当てによって定義されます。これはScalaでは不可能です。評価戦略は(C ++のような)値渡しでも参照渡しでもないので、共有渡しという用語が最も適切だと思います。
于 2012-11-20T10:36:54.387 に答える