gpt4 book ai didi

scala - 匿名函数中的Scala返回语句

转载 作者:行者123 更新时间:2023-12-03 09:30:00 24 4
gpt4 key购买 nike

为什么匿名函数中的显式return语句(使用return关键字的语句)从封闭的命名函数而不是从匿名函数本身返回?

例如。以下程序导致类型错误:

def foo: String = {
((x: Integer) => return x)
"foo"
}

我知道建议您避免使用 return关键字,但是我对为什么显式和隐式return语句在匿名函数中具有不同的语义感兴趣。

在以下示例中, m完成执行后,返回语句“幸存”,并且程序导致运行时异常。如果匿名函数没有从封闭函数返回,则将无法编译该代码。
def main(args: Array[String]) {
m(3)
}

def m: (Integer => Unit) =
(x: Integer) => return (y: Integer) => 2

最佳答案

从形式上讲,返回定义为始终从最近的封闭命名方法返回

A return expression return e must occur inside the body of some enclosing named method or function. The innermost enclosing named method or function in a source program, f , must have an explicitly declared result type, and the type of e must conform to it. The return expression evaluates the expression e and returns its value as the result of f . The evaluation of any statements or expressions following the return expression is omitted.



因此,它在lambda中没有不同的语义。与常规方法不同的是,使用lambda创建的闭包可以避免对封装方法的调用,并且如果这种闭包有返回,则可以获取异常。

If the return expression is itself part of an anonymous function, it is possible that the enclosing instance of f has already returned before the return expression is executed. In that case, the thrown scala.runtime.NonLocalReturnException will not be caught, and will propagate up the call stack.



现在,至于“为什么”。另一个较小的原因是美观:lambda是表达式,无论什么嵌套结构,表达式及其所有子表达式都具有相同的含义是很好的。 Neal Gafter在 http://gafter.blogspot.com/2006/08/tennents-correspondence-principle-and.html上谈到了

但是,它存在的主要原因是,它允许您轻松地模拟命令式编程中常用的控制流形式,但仍允许您将事物抽象为高阶函数。作为一个玩具示例,Java的foreach构造( for (x : xs) { yada; })允许在循环内返回。 Scala没有foreach的语言级别。相反,它将foreach放入库中(由于它们只是对sueach进行糖化,因此不计入 yield 的“for expression”)。非本地返回意味着您可以使用Java foreach并将其直接转换为Scala foreach。

BTW,Ruby,Smalltalk和Common Lisp(不在我头上)也有类似的“非本地” yield 。

关于scala - 匿名函数中的Scala返回语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17754976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com