封闭式的正式防御是什么?这是否取决于编程Languege



根据我的教授,闭合是功能编程语言中功能的值。但是,当我搜索过它时,我看到了另一个定义:

即使在父函数关闭后,闭合是具有访问父范围的函数。

哪一个是正确的?

您在网上发现的定义是正确的。

这是一些伪代码:

i = 1
def foo(j: Int) = {
  k = 2
  return i + j + k
}
foo(42) // returns 45; value of "i" is preserved inside the function

函数foo添加变量ijk的值。变量j是一个函数参数,可变k是函数正文内定义的局部变量。但是变量i来自"外部",称为a free变量

闭合是"关闭"一个或多个免费变量的任何函数。一旦函数完成,就不再需要本地变量和函数参数,这意味着可以弹出函数保留其变量的整个堆栈帧。但是拥有一个自由变量意味着需要将堆栈框架保存在RAM中以备将来使用。

在某些语言中,更改自由变量的值不会影响相应封闭的本地记忆状态,而在其他语言中,更改是可见的。使用较早的ifoo

// some languages, e.g. Javascript:
foo(42) // 45
i = 2
foo(42) // 45
// other languages, e.g. Scala:
foo(42) // 45
i = 2
foo(42) // 46

我不知道您的老师对"功能的价值"的含义。在功能编程中,函数被称为"头等公民",这意味着每个函数都是一个值(可以将其作为函数参数,从函数返回,保存在集合中等(。

最新更新