Sassyブログ

好きなことで暮らしを豊かにするブログ

【Scala入門】引数の名前渡しについて

名前渡しとは、引数の値が評価されて、その評価された値が渡される値渡しなどとは異なり
関数の呼び出し時に評価されずに必要な時に評価される形式を「名前渡し」といいます。

必要な時とはどのようのようなときでしょうか。

それは参照されるときです。

では実際に名前渡しを見てみましょう。

以下のサンプルコードでは名前渡しと比較するために値渡しのコードも載せています。

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の値で出力することが可能になります。

以上