web-dev-qa-db-ja.com

中括弧の間でコードのブロックとして関数を渡す

数回私はそのようなScalaコードを見ました:

object Doer{
   def doStuff(op: => Unit) {
      op
   }
}

このようにして呼び出されます:

Doer.doStuff{
      println("Done")
}

私にとって奇妙なのは、関数が中括弧の間のコードのブロックとして別の関数に渡される方法です。また、通常は引数リストの最初と最後を示す括弧もありません。

これの名前は何ですかScala syntax/feature?どのような場合に使用できますか?どこに文書化されていますか?

34
Piotr Sobczyk

これはnullary functionまたはthunkと呼ばれ、call-byの例です-name Evaluationhttp://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関数をリストに追加するのではなく、戻り値のみを追加します。

46
Dan Simon