c - Указатель массива, инициализированного в функции, содержит неверные значения после возврата

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

Возвращаемое выражение 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 "возвращается.

0
задан Dabrut 28 March 2013 в 10:06
поделиться