Ответ 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)
вы не добавляете в список нулевую функцию, а только ее возвращаемое значение.