3

对于以下问题: 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)
}

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

4

3 回答 3

19

根据我的理解randList,绝对不是闭包(维基百科似乎同意),因为 - 在您提供的代码片段中 - 它仅取决于局部变量(参数也被视为局部变量)。考虑到 的主体randList,没有所谓的自由变量,即不从当前词法作用域获取值的变量,后者就是方法体本身。lenn都是当前词法范围的变量,因为它们都是 . 的封闭定义的参数randList

考虑这个例子:

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

println(f(1)) // 11

n = 20
println(f(1)) // 21

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

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

// n == 20
// f as above

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

println(foo(f)) // 21

的结果foo(f)仍然是21虽然foo定义了自己的局部变量n,但可以假设f现在使用 this n。但是,闭包f与围绕其声明的词法范围耦合,这是评估n时取值的地方f

于 2012-09-27T07:07:15.060 回答
0

我同意@Malte,因为 randList 不依赖于函数外部声明的任何变量。所以这个函数不是闭包。

于 2018-02-21T16:49:52.447 回答
-1

据我了解,闭包是一个可以引用另一个函数中的状态的函数。查看此线程以获取更多详细信息:什么是“闭包”?.

在这个问题中,由于randList没有引用任何外部变量,所以它不是闭包......

于 2012-09-27T06:26:22.637 回答