我想知道在闭包内修改自由变量是否有意义。我无法找到任何信息,无论它是否被视为坏的或良好的做法。
简单示例:
var a = 2;
val f = (x: Int) => {a = x + 2;}
f(2)
是一个合适的,最先进的闭包(它是否完全闭合)?
答案 0 :(得分:1)
闭包的主要目的是关闭一些状态并能够更新它。现在,您可以在某处传递函数f
,当您调用它时,a
将会更新。所以f
是一个恰当的封闭。它是最先进的吗?这取决于上下文和这个闭包的作用。在您的情况下,您可以通过a
或直接重新分配f
更改a
值。因此,我们不清楚您希望如何更新a
以及哪种方式更可取。
有几种方法可以使用闭包。您可以使用它们来保持封闭内的某些状态(请参阅Lisp cons 或 list 实现)。这种状态在函数内部声明,没有什么可以从外部改变它。你只需返回另一个函数 - 闭包,它是唯一可以访问内部状态的函数。
另一个例子是回调。实际上,f
看起来更像callback,因为它不会保留任何状态,但会引用a
。因此,即使a是私有的,您也可以在某处传递f
以便能够更新a
。