Должен ли параметр callbyname быть заключен в фигурные скобки при вызове функции?
В курсе Coursera Functional Reactive Programming Week 3, лекция 4 Эрик Мейер реализует функцию повторения для Future, которая будет повторять вычисления заданное число раз. Он определяет block
в качестве параметра call_by_name, поскольку Future должен оцениваться при каждой повторной попытке, а не только один раз.
def retry(noTimes: Int)(block: =>Future[T]): Future[T] = {
if (noTimes == 0) {
Future.failed(new Exception(“Sorry”))
} else {
block fallbackTo {
retry(noTimes–1) { block }
}
}
}
Мой вопрос: с block
это уже параметр call_by_name, нужно ли оборачивать его в блок при вызове или это просто для удобства чтения?
retry(noTimes–1) { block }
//same as?
retry(noTimes–1)(block)
Тот же вопрос с fallbackTo
def fallbackTo(that: =>Future[T]): Future[T] = {
this recoverWith {
case _ => that recoverWith { case _ ⇒ this }
}
fallbackTo { retry(noTimes–1) { block } }
//same as?
fallbackTo ( retry(noTimes–1)(block) )
1 ответ
Нет, не нужно помещать их в фигурные скобки. Это ваш выбор, и я думаю, что Эрик выбрал фигурные скобки, потому что именно так будет вызываться функция. Как только вы сделаете несколько операторов, вам придется использовать фигурные скобки, потому что скобки предназначены только для отдельных выражений.
В рекурсивном вызове есть только одно выражение (а именно block
) так что вы можете оставить фигурные скобки, если хотите. Не имеет никакого значения.
Чтобы добавить заслуживающую доверия ссылку: в Scala by Example Мартина Одерского на стр. 6 вы найдете пример параметров вызова по имени в очень похожем случае, но без фигурных скобок:
def While (p: => Boolean) (s: => Unit) {
if (p) { s ; While(p)(s) }
}