【发布时间】:2018-04-12 11:32:52
【问题描述】:
在 Scala 语言规范 6.20 返回表达式中,它说: “返回表达式 return e 必须出现在某个封闭的命名方法或函数的主体内。源程序中最内层的封闭命名方法或函数,f...”
这里有一个innermost enclosing f,我想为return找到那个f。但是当涉及到匿名函数时,事情就变得有点复杂了。
示例 1:这里最里面的 f 是f1。在反编译的java代码中,我们可以看到异常被f1捕获。
def main(args: Array[String]) {
def f1() { () => return }
}
示例 2:这里最里面的 f 仍然是f1。在反编译的java代码中,我们可以看到异常仍然被f1捕获,尽管从执行视图来看,f2是return最里面的封闭f。
def main(args: Array[String]) {
def f2(x: Any) { println(x) }
def f1() { f2(() => return) }
}
也许我们可以说,在 Example2 中,x 并没有真正在 f2 中执行。但这是另一个奇怪的例子。
Example3:这里最里面的f是main,不是map和println。(但是我知道map或者println的class文件不能在这里改。)
def main(args: Array[String]) {
val list = List(1, 2, 3)
println(list.map(x => return x * 2))
}
总之,这个innermost enclosing f 似乎就是那个直接包含返回表达式的精确def 的方法。
我说的对吗?
【问题讨论】:
-
您的问题不清楚。为什么你认为
f2包含return?return被f1包围,f1被main包围,f2甚至没有进入图片。在您的最后一个示例中,只有一个函数main,因此显然它必须是封闭函数,因为没有其他函数。 -
@JörgWMittag Emmmmmm...在最后一个示例中,还有其他方法,例如 println 和 map。Andrey 的“封闭定义”让我很清楚。我太纠结于调用顺序了。无论如何,感谢您对我奇怪的问题的评论。
-
return不在map的正文中。map的主体甚至没有显示在那里。那里唯一的身体是main's。
标签: scala