Хотя используемые функции не редкость, я признаю, что это довольно странная комбинация функций.Основная хитрость заключается в том, что любой блок в Scala является выражением, тип которого совпадает с последним выражением в блоке.Если последнее выражение является функцией, это означает, что блок имеет функциональный тип и, следовательно, может использоваться в качестве аргумента для «map» или «foreach».В этих случаях происходит то, что при вызове «map» или «foreach» блок оценивается.Блок оценивается как функция (i => i * 5 в первом случае), и эта функция затем отображается в диапазоне.
Одним из возможных применений этой конструкции является то, что блок определяет изменяемые переменные, а результирующая функция изменяет переменные при каждом вызове.Переменные будут инициализированы один раз, закрыты функцией, а их значения будут обновляться при каждом вызове функции.
Например, вот несколько удивительный способ вычисления первых 6 факторных чисел
(1 to 6) map {
var total = 1
i => {total *= i;total}
}
(Кстати, извините за использование факториала в качестве примера. Это был либо тот, либо Фибоначчи. Функциональное программированиеПравила гильдии. У вас проблема с этим, разберитесь с ребятами в зале.)
Менее настоятельная причина, чтобы блок возвращал функцию, - это определение вспомогательных функций ранее в блоке.Например, если бы ваш второй пример был взамен
(1 to 3) foreach {
def line = Console.readLine
i => println(line)
}
Результатом было бы то, что три строки были прочитаны и отображены по одному разу, в то время как в вашем примере строка прочиталась один раз и повторила три раза.