为什么以下Scala函数被称为闭包?

Min*_*ran 3 closures scala

对于以下问题:http://pastie.org/4825115,这是我的代码:http://pastie.org/private/n22zohyshn2ymqrbrb3g

def randList(len: Int, n: Int): List[Int] = len match {
  case 0 => List()
  case len => scala.util.Random.nextInt(n) :: randList(len-1, n)
}
Run Code Online (Sandbox Code Playgroud)

但我不知道为什么randList被称为闭包.

Mal*_*off 18

根据我的理解randList绝对不是一个闭包(维基百科似乎同意),因为 - 在你提供的代码片段中 - 它只取决于局部变量(参数也被认为是局部变量).考虑到主体randList,没有所谓的自由变量,即一个不能从当前词法范围中获取其值的变量,后者是方法体本身.len并且n都是当前词法范围的变量,因为它们都是封闭定义的参数randList.

考虑这个例子:

var n = 10
val f = (x: Int) => x + n

println(f(1)) // 11

n = 20
println(f(1)) // 21
Run Code Online (Sandbox Code Playgroud)

该函数f是一个闭包,因为它不仅取决于它的参数,还取决于在其自己的词法范围之外声明的变量(即n).

维基百科的文章提到闭包是由一个函数和一个声明自由参数的词法范围定义的.下一个例子说明了这一点:

// n == 20
// f as above

def foo(g: Int => Int) = {
  val n = 100
  g(1)
}

println(foo(f)) // 21
Run Code Online (Sandbox Code Playgroud)

虽然定义了自己的局部变量,但结果foo(f)仍然可以假设现在使用它.但是,闭包耦合到围绕其声明的词法范围,该声明是从评估时获取的值.21foonfnfnf