Scala匿名函数中return语句的最内层包围命名方法/函数定位
Scala中return表达式的最内层包围方法/函数定位问题
咱们先从官方规范的定义入手,《Scala语言规范》6.20返回表达式章节明确规定:
return表达式return e必须出现在某个包围的命名方法或函数体内。源程序中最内层的包围命名方法或函数为f...
但这里有个容易混淆的关键点:匿名函数不算“命名方法或函数”,所以当return出现在匿名函数内部时,情况就变得复杂了——它不会绑定到当前的匿名函数,而是要往外层找最近的那个命名方法/函数。
举个实际的例子(也就是你提到的示例1):
def f1(): Int = { // 定义一个匿名函数 val anonFunc = () => { return 100 // 这里的return对应的最内层包围f是f1,而非这个匿名函数 } anonFunc() 200 // 这行代码永远不会执行 }
你去看反编译后的Java代码就能明白底层逻辑:Scala是通过抛出一个特殊的scala.runtime.NonLocalReturnControl异常来实现这种跨匿名函数的return的。当匿名函数里的return执行时,会抛出携带返回值100的异常,外层的命名方法f1会捕获这个异常,直接返回100,完全跳过后续的代码执行。
简单来说,只要return身处匿名函数内部,就直接忽略这个匿名函数,往上找第一个有名字的方法/函数,那就是它的最内层包围f。
内容的提问来源于stack exchange,提问作者lzwang2
相关产品推荐
相关产品推荐

