Неверная ошибка возврата в scala [duplicate]

Если ваше исходное кодовое имя HelloWorld.java, ваш скомпилированный код будет HelloWorld.class.

Вы получите эту ошибку, если вы вызываете ее, используя:

java HelloWorld.class

Вместо этого используйте это:

java HelloWorld
28
задан amaurremi 19 July 2013 в 21:30
поделиться

2 ответа

Формально говорящий возврат определяется как всегда возвращающийся из ближайшего охватывающего именованного метода

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

Таким образом, у нее нет другой семантики в лямбда. Морщина заключается в том, что, в отличие от обычного метода, закрытие, созданное из лямбда, может избежать вызова метода окружения, и вы можете получить исключение, если есть возврат в таком закрытии.

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

Теперь, что касается «почему». Еще одна причина - эстетика: lambdas - это выражения, и хорошо, когда выражение и все его подвыражения имеют одинаковое значение независимо от структуры вложенности. Нил Гафтер говорит об этом в http://gafter.blogspot.com/2006/08/tennents-correspondence-principle-and.html

Основная причина, по которой она существует, хотя , это позволяет легко моделировать формы потока управления, обычно используемые в императивном программировании, но все же позволяет абстрагироваться от функций более высокого порядка. В качестве примера игрушек конструкция foreach Java (for (x : xs) { yada; }) позволяет возвращать внутри цикла. Scala не имеет языкового уровня foreach. Вместо этого он помещает foreach в библиотеку (не считая «для выражения» без урожая, поскольку они просто desugar для foreach). Наличие нелокального возврата означает, что вы можете использовать Java foreach и переводить непосредственно в Scala foreach.

Кстати, Ruby, Smalltalk и Common Lisp (с моей головы) также имеют похожие «non -local "возвращается.

18
ответ дан Pietu1998 31 August 2018 в 16:43
поделиться

Ключевое слово return зарезервировано для (класса) методов, оно не может использоваться в функциях. Вы можете легко проверить это:

object Foo {
  val bar = (i: Int) => return i + i
}

Это дает

<console>:42: error: return outside method definition
       object Foo { val bar = (i: Int) => return i + i }
                                          ^

В основном вы можете рассматривать методы и функции как одно и то же, из-за того, что метод apply функции синтаксически похож вызов метода и так называемое eta-расширение, позволяющее передавать метод как аргумент функции.

В этом случае это имеет значение. При определении как метода это законно:

object Foo { 
  def bar(i: Int): Int = return i + i
}

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

3
ответ дан Community 31 August 2018 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: