参照の値渡しとは? わかりやすく解説

参照の値渡し

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/03 01:23 UTC 版)

評価戦略」の記事における「参照の値渡し」の解説

参照の値渡し (共有呼び: call by sharingオブジェクト呼び: call by objectcall by object-sharing) は Barbara Liskov 他によって1974年CLU言語最初に call by sharing呼ばれた評価戦略である。 日本語では参照の値渡しとも呼ばれるPythonIotaJavaRubyJavaScriptSchemeOCamlAppleScript等の多数言語使われている。しかしながら「参照の値渡し」という用語は一般的では無く異な情報源間で用語の混乱見られる例えば、Java分野ではJava全て値渡しであると言われている。参照の値渡しは、言語上の値がプリミティブ型ではなくオブジェクト基づいているということ、つまり全ての値が「ボックス化」されていることを意味している。 参照の値渡しの意味論は参照渡しとは異なる: "In particular it is not call by value because mutations of arguments performed by the called routine will be visible to the caller. And it is not call by reference because access is not given to the variables of the caller, but merely to certain objects"(意訳とりわけ呼び出し先で行われた引数対す変更呼び出し元からも見えるため、値渡しではない。また、アクセス呼び出し元の変数ではなく、単にあるオブジェクトに対して行われるため、参照渡しでもない。」) だから、例えば、変数渡されたとき、呼び出し先のスコープ内で変数への代入装うことは不可能である。ただし、関数呼び出し元と同じオブジェクト(コピーされたものではない)にアクセスできるため、オブジェクト可変(ミュータブル)であれば関数内でのオブジェクトへの変更呼び出し元に反映される。これは値渡しの意味論とは異な動作である。オブジェクトコピーでもクローンでもない、つまり共有されているから、関数内での可変オブジェクトへの変更は、呼び出し元からも見えと言うことである。例として、配列(Array)が可変であるRubyで書くと: def f(arr) arr.append(1)endm = []f(m)p m これは [1] を出力する。なぜなら、appendメソッド呼び出されオブジェクト変更しているからだ。 これらの言語では、変数を渡すことは、変数によって参照される実際オブジェクト渡す(アクセスする)事を意味しており、オリジナルの(呼び出し元の)変数アクセする事では意味しているわけでは無いため、関数内での代入呼び出し元に影響与えない。再束縛され変数(仮引数となる変数)は関数内にしか存在しないため、呼び出しと元の対応する変数(実引数となる変数)は元の束縛維持する上記Rubyでの変更動作新しオブジェクト引数代入する次のコード比較してみると: def f(arr) arr = [1]endm = []f(m)p m これは [] を出力する。なぜなら、arr = [1] という式は、新し配列を、変数参照する(つまりはオブジェクト実体保存されている)場所ではなく変数そのものに再代入するからだ。 不変(イミュータブル)オブジェクトでは、オブジェクト識別変数そのものである言語除き、参照の値渡しと値渡し実質的な違いはない。可変オブジェクトでの参照の値渡しは、入出引数(input/output parameters)に代わるのである: 仮引数代入せず(引数上書きせず、オブジェクト識別変更しない)に、オブジェクト(引数)を変更する。 この用語は海外Pythonコミュニティ(call by sharingとして)および日本Rubyコミュニティ(参照の値渡しとして)では広く使用されているが、JavaVisual Basic等の他の言語では同一の意味論でも値渡しとし、この場合の値はオブジェクトへの参照であると記述される場合が多い。

※この「参照の値渡し」の解説は、「評価戦略」の解説の一部です。
「参照の値渡し」を含む「評価戦略」の記事については、「評価戦略」の概要を参照ください。


参照の値渡し

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/20 07:25 UTC 版)

引数」の記事における「参照の値渡し」の解説

参照渡しで言うところの「参照」と呼ばれているものと、特定の言語で「参照」と呼ばれているものが必ずしも同じでない事には注意が必要。例えば、Java参照型を扱うための『Javaの「参照」』を持つが、これはPascal等のポインタ相当で、『参照渡しの「参照」』とは概念が違うため、『Javaの「参照」』を渡して参照渡しであるとは言えない。C言語の「ポインタ値渡し」と同じである 。これは、Java参照型似た参照型と、Javaのプリミティブ型に近い値型を持つC#を見ると理解しやすいだろうC#では、特に指定しなければ参照型値型値渡しされるが、引数ref もしくは out使用する事によって参照渡しにする事ができる。『C#値型』を渡すから値渡し、『C#参照型』を渡すから参照渡しとはならない

※この「参照の値渡し」の解説は、「引数」の解説の一部です。
「参照の値渡し」を含む「引数」の記事については、「引数」の概要を参照ください。

ウィキペディア小見出し辞書の「参照の値渡し」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「参照の値渡し」の関連用語

参照の値渡しのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



参照の値渡しのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの評価戦略 (改訂履歴)、引数 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS