-1
лестницу

Я пытаюсь сделать что-то вроде этого:`return` в функции буквального

var fun : (Int,Int) => Double = (a,b) => 
{ 
    // do something 
    return 1.0 
} 

Однако мои IDE жалобы с Return statement outside method definition. Итак, как я могу явно указать оператор return в литерале функции в scala?

+0

Я уже ответил на аналогичный вопрос: http: // stackoverflow.com/a/24241486/985949 – Mik378

ответ

7

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

Но это не идиоматично и сильно обескуражен.

+0

'return' также может использоваться для возврата из именованной функции. –

-6

В Скале нет return. В любой функции последний выполненный результат - это возвращаемое значение. Если этот последний оператор не соответствует ожидаемому типу возвращаемой функции, компилятор будет вызывать ошибку.

+0

Этот функциональный принцип работает по всему телу функции, в соответствии с условными обозначениями/петлями; например 'if (cond) valReturnedIfCond else valReturnedElse' – cchantep

+2

Существует действительно оператор return, и его можно использовать в коде императивного стиля для ранних выходов и т. п. Он нахмурился. –

+0

@DonRoby вы правы, но императив Scala для меня не интересует – cchantep

5

Не используйте возврат, он заставляет Scala плакать.

scala> var fun: (Int, Int) => Double = (a, b) => { 
    | // do something 
    | 1.0 
    | } 
fun: (Int, Int) => Double = <function2> 

scala> fun(1, 2) 
res4: Double = 1.0 

Или еще лучше:

scala> def fun: (Int, Int) => Double = (a, b) => { 
    | // do something 
    | 1.0 
    | } 
fun: (Int, Int) => Double 

scala> fun(1, 2) 
res4: Double = 1.0 
2

Как явным образом дать оператор return в литерале функции в scala?

Вы не можете. Это отвечает the language specification раздел 6.20, Return Выражения:

Возвращение выражение return e должно происходить внутри тела некоторого объемлющего имени метода или функции.

Метод apply, который генерируется компилятором в качестве расширения анонимной функции, не считается именованной функцией в исходной программе, поэтому поэтому никогда не является объектом обратного выражения.

Смежные вопросы