2014-10-06 1 views
0

В курсе Курса функционального реактивного программирования Неделя 3 Лекция 4 Эрик Мейер реализует функцию повтора для Будущего, которая будет повторять вычисление определенное количество раз. Он определяет block как параметр call_by_name, так как будущее должно оцениваться при каждой попытке и не только один раз.Должен ли быть вызван параметр callbyname в фигурных скобках при вызове funciton?

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) } 
}