在Scala中修改闭包内的自由变量

时间:2015-08-29 12:18:17

标签: scala closures

我想知道在闭包内修改自由变量是否有意义。我无法找到任何信息,无论它是否被视为坏的或良好的做法。

简单示例:

var a = 2;
val f = (x: Int) => {a = x + 2;}
f(2)

是一个合适的,最先进的闭包(它是否完全闭合)?

1 个答案:

答案 0 :(得分:1)

闭包的主要目的是关闭一些状态并能够更新它。现在,您可以在某处传递函数f,当您调用它时,a将会更新。所以f是一个恰当的封闭。它是最先进的吗?这取决于上下文和这个闭包的作用。在您的情况下,您可以通过a或直接重新分配f更改a值。因此,我们不清楚您希望如何更新a以及哪种方式更可取。

有几种方法可以使用闭包。您可以使用它们来保持封闭内的某些状态(请参阅Lisp cons list 实现)。这种状态在函数内部声明,没有什么可以从外部改变它。你只需返回另一个函数 - 闭包,它是唯一可以访问内部状态的函数。

另一个例子是回调。实际上,f看起来更像callback,因为它不会保留任何状态,但会引用a。因此,即使a是私有的,您也可以在某处传递f以便能够更新a