Scala 関数の名前呼び出し(call-by-name)
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 関数