数回私はそのようなScalaコードを見ました:
object Doer{
def doStuff(op: => Unit) {
op
}
}
このようにして呼び出されます:
Doer.doStuff{
println("Done")
}
私にとって奇妙なのは、関数が中括弧の間のコードのブロックとして別の関数に渡される方法です。また、通常は引数リストの最初と最後を示す括弧もありません。
これの名前は何ですかScala syntax/feature?どのような場合に使用できますか?どこに文書化されていますか?
これはnullary functionまたはthunkと呼ばれ、call-byの例です-name Evaluation: http://www.scala-lang.org/old/node/138
パラメータリストがあれば、どこでもnullariesを使用できます。これらは基本的に、引数のない関数の周りの単なる構文上のシュガーであり、通常の値のように見え、参照されるたびに呼び出されます。
そう
_def doSomething(op: => Unit) {
op
}
doSomething {
println("Hello!")
}
_
とまったく同じです:
_def doSomething(op: () => Unit) {
op()
}
doSomething(() => println("Hello!"))
_
Nullariesで注意すべきことの1つは、nullariesが参照されるたびに呼び出されるため、次のようなものです。
_def foo(op: => Int) = op + op
foo {
println("foo")
5
}
_
「foo」を2回出力します。
Edit:Randallのコメントを拡張すると、nullary関数がゼロ引数関数と異なる大きな方法の1つは、nullariesがファーストクラスではないことです。値。たとえば、List[() => Int]
は使用できますが、_List[=> Int]
_は使用できません。そしてあなたが次のようなものを持っていた場合:
_def foo(i: => Int) = List(i)
_
nullary関数をリストに追加するのではなく、戻り値のみを追加します。