Они, возможно, одинаковы в этом сценарии, но есть много других сценариев, когда () => A
и A
сильно отличаются друг от друга. () => A
называется thunk и используется для передачи части отложенного вычисления функции. Тело «thunk» не оценивается до тех пор, пока вызываемая функция не решит его оценить. Otherwitse, значение передаваемого аргумента оценивается вызывающим.
Рассмотрим пример, где есть разница между версией, которая принимает и преобразователь, версия, которая просто принимает значение:
object Thunk {
def withThunk(f:() ⇒ String): Unit = {
println("withThunk before")
println("the thunk's value is: " + f())
println("now the thunk's value is: " + f())
}
def withoutThunk(f: String): Unit = {
println("withoutThunk before")
println("now the value's value is: " + f)
}
def main(argv: Array[String]): Unit = {
withThunk {() ⇒ println("i'm inside a thunk"); "thunk value" }
println("------------")
withoutThunk { println("i'm not inside a thunk"); "just a value" }
}
}
Эта программа продемонстрирует некоторые различия. В версии thunk вы видите, что «withThunk before» печатается до того, как в первый раз «i'm in the thunk» печатается, который печатается дважды, так как f() оценивается дважды. В версии, отличной от thunk, «Я не внутри thunk» печатается до «withoutThunk before», так как это оценивается перед отправкой функции в качестве аргумента.