在匿名函数中找到返回的封闭f

时间:2018-04-12 11:32:52

标签: scala

在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捕获,即使从执行视图来看,f2return最里面的封闭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的方法。

我是对的吗?

1 个答案:

答案 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 ...}将会returnreturn只会返回当前的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> 大多无用。