English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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 の関数