В Scala а return
заявление возвращается из тела метода вшита. Если return
появляется внутри функционального литерала, он выполняется с использованием исключения. return
выдает исключение внутри функции, которое затем будет уловлено в качестве метода размещения. Scala работает таким образом, чтобы сделать использование конструкций таможенного контроля, которые имеют функции невидимые, например:
def geometricAverage(l: List[Double]): Double = {
val product = l.foldLeft(1.0) { (z, x) =>
if (x == 0) return 0 else z * x
}
Math.pow(product, 1.0/l.length)
}
return
в этом примере возвращается из метода geometricAverage
, что позволяет ему завершить немедленно, если 0 найден , Вам не нужно знать, что foldLeft
- это метод, который использует функцию, а не встроенную конструкцию для реализации этого.
Предпочтение в Scala заключается в том, чтобы писать функции в функциональном стиле, используя экспрессионную ориентацию Scala, чтобы сделать ненужным return
. Например:
val fun: (Int,Int) => Double = (a,b) => {
if (a == b) {
// side effect here, if desired
0.0
} else {
// side effect here, if desired
1.0
}
}
Если вы действительно хотите использовать return
в определении функции можно реализовать соответствующую функцию интерфейса вручную, не используя функцию буквальное:
val fun = new Function2[Int, Int, Double] {
def apply(x: Int, y: Int): Double = {
if (x == y)
return 0.0
1.0
}
}
Но это не идиоматично и сильно обескуражен.
Я уже ответил на аналогичный вопрос: http: // stackoverflow.com/a/24241486/985949 – Mik378