Подтвердить что ты не робот

Scala: передача функции как блока кода между фигурными фигурными скобками

Несколько раз я видел такой код Scala:

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

Вызывается таким образом:

Doer.doStuff{
      println("Done")
}

Что для меня странно, так это то, как функция передается другой функции как блок кода между фигурными фигурными скобками. И даже нет круглых скобок, которые обычно отмечают начало и конец списка аргументов.

Каково имя этого синтаксиса/функции Scala? В каких случаях я могу его использовать? Где это задокументировано?

4b9b3361

Ответ 1

Это называется либо нулевой функцией, либо thunk, и является примером оценки по имени: http://www.scala-lang.org/old/node/138

Вы можете использовать нулевые значения почти везде, где у вас есть список параметров. Они в основном представляют собой синтаксический сахар вокруг функций с нулевым аргументом, которые делают их похожими на обычные значения и вызывается, когда они ссылаются.

Итак,

def doSomething(op: => Unit) {
  op
}
doSomething {
  println("Hello!")
}

точно такая же, как:

def doSomething(op: () => Unit) {
  op()
}
doSomething(() => println("Hello!"))

Единственное, что нужно иметь в виду с помощью nullaries, - они вызывается каждый раз, когда на них ссылаются, поэтому что-то вроде:

def foo(op: => Int) = op + op
foo {
  println("foo")
  5
}

дважды напечатает "foo".

Изменить. Чтобы развернуть комментарий Randall, один из больших способов, отличающийся от нулевой функции от функции zero-arg, заключается в том, что нулевые значения не являются первоклассными. Например, вы можете иметь List[() => Int], но вы не можете иметь List[=> Int]. И если у вас есть что-то вроде:

def foo(i: => Int) = List(i)

вы не добавляете в список нулевую функцию, а только ее возвращаемое значение.