Scala-partially-applied-functions

提供:Dev Guides
移動先:案内検索

Scala-部分的に適用された関数

関数を呼び出すと、その関数を引数に適用していると言われます。 予想されるすべての引数を渡すと、完全に適用されています。 いくつかの引数のみを送信すると、部分的に適用された関数が返されます。 これにより、いくつかの引数をバインドし、残りを後で入力できるようになります。

以下を試してください、それは部分的に適用された機能を示すための簡単なプログラム例です-

import java.util.Date

object Demo {
   def main(args: Array[String]) {
      val date = new Date
      log(date, "message1" )

      Thread.sleep(1000)
      log(date, "message2" )

      Thread.sleep(1000)
      log(date, "message3" )
   }

   def log(date: Date, message: String)  = {
      println(date + "----" + message)
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

C:/>scalac Demo.scala
C:/>scala Demo

出力

Mon Dec 02 12:52:41 CST 2013----message1
Mon Dec 02 12:52:41 CST 2013----message2
Mon Dec 02 12:52:41 CST 2013----message3

ここでは、log()メソッドは_date_と_message_の2つのパラメーターを取ります。 日付には同じ値を使用しますが、メッセージには異なる値を使用して、メソッドを複数回呼び出します。 log()メソッドに引数を部分的に適用することにより、各呼び出しに日付を渡すノイズを除去できます。 これを行うには、最初に値を日付パラメーターにバインドし、その場所にアンダースコアを配置して2番目のパラメーターをバインドしないままにします。 結果は、変数に保存した部分的に適用された関数です。

次のサンプルプログラムを試して、バインドされていない引数メッセージのみでこの新しいメソッドを呼び出してください。

import java.util.Date

object Demo {
   def main(args: Array[String]) {
      val date = new Date
      val logWithDateBound = log(date, _ : String)

      logWithDateBound("message1" )
      Thread.sleep(1000)

      logWithDateBound("message2" )
      Thread.sleep(1000)

      logWithDateBound("message3" )
   }

   def log(date: Date, message: String) = {
      println(date + "----" + message)
   }
}

上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

Mon Dec 02 12:53:56 CST 2013----message1
Mon Dec 02 12:53:56 CST 2013----message2
Mon Dec 02 12:53:56 CST 2013----message3