名前渡しとは、引数の値が評価されて、その評価された値が渡される値渡しなどとは異なり
関数の呼び出し時に評価されずに必要な時に評価される形式を「名前渡し」といいます。
必要な時とはどのようのようなときでしょうか。
それは参照されるときです。
では実際に名前渡しを見てみましょう。
以下のサンプルコードでは名前渡しと比較するために値渡しのコードも載せています。
object sample { var x: String = "値渡し" def main(args: Array[String]): Unit = { valueWatashi("これは「" + x + "」です。") ・・・ ① nameWatashi("これは「" + x + "」です。") ・・・ ② } def valueWatashi(value: String): Unit = { x = "名前渡し" println(value) } def nameWatashi(value: => String): Unit = { x = "名前渡し" println(value) } }
これを実行すると
これは「値渡し」です。 これは「名前渡し」です。
と表示されます。
サンプルコードの①では、
『"これは「" + x + "」です。"』の部分が評価され『これは「値渡し」です。』という値が渡されております。
そして、valueWatashiメソッドの仮引数の「value」の値には『これは「値渡し」です。』の文字列が入っているということになります。
そのため、xに「"名前渡し"」の文字列を代入しても評価済みの値のため内容は書き換わらず、
『これは「値渡し」です。』が出力されるのです。
それに対してサンプルコード②では、『"これは「" + x + "」です。"』が評価されず渡されます。
そして、nameWatashiメソッドの仮引数の「value」には『"これは「" + x + "」です。"』の式が入っています。
そのため、xに"名前渡し"の文字列を代入してもvalueはまだ評価されていなく、
「println(value)」の呼び出し時に式が評価されるので『これは「名前渡し」です。』とxの値で出力することが可能になります。
以上