在Scala语言规范6.20表达式中,它说: "返回表达式返回e必须出现在一些封闭的命名方法或函数的主体内。在源程序中最内层的命名方法或函数,f ..."
此处有一个innermost enclosing f
,我想为f
找到return
。但是当谈到匿名功能时,事情变得有点复杂。
示例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) }
}
也许我们可以说,在例2中,x
并不是在f2中执行的。但这是另一个奇怪的例子。
示例3:这里最里面的封闭f是main
,而不是map和println。(但我知道map或println的类文件不能在这里更改。)
def main(args: Array[String]) {
val list = List(1, 2, 3)
println(list.map(x => return x * 2))
}
总之,似乎这个innermost enclosing f
正好是具有直接包含返回表达式的精确def的方法。
我是对的吗?
答案 0 :(得分:1)
是的,你是对的。 “封闭”是指“封闭 def inition”。
正如你自己已经注意到的那样,它不能引用“封闭方法调用”,因为那时甚至可以像早期return
的以下规范用例一样简单:
def findFirstGreaterZero(as: List[Int]): Option[Int] = {
for (a <- as) {
if (a > 0) return Some(a)
}
None
}
即使这里没有明确的lambdas,也行不通。如果for
将“包含”(a <- as).foreach{ a => ... return }
关键字,则{ a => ... return ...}
将会return
,return
只会返回当前的foreach
关键字。 findFirstGreaterZero
的正文,而不是从方法return
返回,这会使<label>Type your name: </label>
<input type="text" id="txtName">
<input type="button" value="click me" onclick="transfer()">
<script>
function sayHi(){
var txtName = document.getElementById("txtName");
var txtOutput = document.getElementById("txtOutput");
var name = txtName.value;
txtOutput.value = "Hi there, " + name + "!";
}
function transfer() {
location.href = "output.html";
}
</script>
大多无用。