Если ваше исходное кодовое имя HelloWorld.java, ваш скомпилированный код будет HelloWorld.class
.
Вы получите эту ошибку, если вы вызываете ее, используя:
java HelloWorld.class
Вместо этого используйте это:
java HelloWorld
Формально говорящий возврат определяется как всегда возвращающийся из ближайшего охватывающего именованного метода
Возвращаемое выражение return e должно происходить внутри тела некоторого закрытого именованного метода или функции. Внутренний закрытый именованный метод или функция в исходной программе f должен иметь явно объявленный тип результата, и тип e должен соответствовать ему. Возвращаемое выражение оценивает выражение e и возвращает его значение в результате f. Оценка любых операторов или выражений, следующих за возвращаемым выражением, опущена.
blockquote>Таким образом, у нее нет другой семантики в лямбда. Морщина заключается в том, что, в отличие от обычного метода, закрытие, созданное из лямбда, может избежать вызова метода окружения, и вы можете получить исключение, если есть возврат в таком закрытии.
Если выражение return само по себе является частью анонимной функции, возможно, что входящий экземпляр f уже возвращен до выполнения выражения return. В этом случае брошенное значение scala.runtime.NonLocalReturnException не будет поймано и будет распространять стек вызовов.
blockquote>Теперь, что касается «почему». Еще одна причина - эстетика: 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 "возвращается.
Ключевое слово 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
только в методах, разрешающих условные (ранние) возвращения. См. этот пост для обсуждения методов и функций.