Scala 関数の名前呼び出し(call-by-name)

Scala 函数Scala 関数

Scalaのインタプリタは関数引数(function arguments)を解析する際に2つの方法があります:

  • 値呼び出し(call-by-value):パラメータ式の値を先に計算してから、関数内部に適用します;
  • 名前呼び出し(call-by-name):未計算のパラメータ式を関数内部に直接適用します

関数内部に入る前に、値呼び出し方式ではすでにパラメータ式の値を計算し終えていますが、名前呼び出しでは関数内部でパラメータ式の値の計算を行います。

これにより、名前呼び出しを使用するたびに、インタプリタが式の値を一度計算するという現象が発生します。

object Test {
   def main(args: Array[String]) {
        delayed(time());
   }

   def time() = {
      println("获取时间,单位为纳秒")
      System.nanoTime
   }
   def delayed( t: => Long ) = {
      println("在 delayed 方法内")
      println("参数: " + t)
      t
   }
}

上記の例では delayed メソッドを宣言しました。このメソッドは変数名と変数型に => 記号を使用して名前呼び出しを設定します。上記のコードを実行すると、出力結果は次のようになります:

$ scalac Test.scala 
$ scala Test
在 delayed 方法内
获取时间,单位为纳秒
参数: 241550840475831
获取时间,单位为纳秒

この例では、delay メソッドがメソッドに入ったことを示すメッセージを出力し、次に delay メソッドが受け取った値を出力し、最後に t を返します。

Scala 函数Scala 関数

その他の拡張