class CallbackState{
object state;
public CallbackState(object state){this.state = state;}
public void Callback(){
// do something with state
}
}
void Foo(){
object state = GenerateState();
CallbackState callback = new CallbackState(state);
PerformOperation(callback.Callback);
}
这是伪 C # ,但在概念上与其他面向对象语言相似。正如您所看到的,回调类管理状态涉及大量的样板。使用闭包会简单得多:
void Foo(){
object state = GenerateState();
PerformOperation(()=>{/*do something with state*/});
}
这是一个 lambda (同样是在 C # 语法中,但是在其他支持闭包的语言中概念相似) ,它为我们提供了类的所有功能,而不必编写、使用和维护一个单独的类。
对象可以作为闭包的替代品,这一点很容易理解,只需将捕获的状态放在对象中,并将调用作为方法。实际上,例如 C + + lambda 闭包是作为对象实现的(对于 C + + 来说,事情有点棘手,因为语言不提供垃圾收集,真正的带有可变共享状态的闭包因为捕获的上下文的生命周期而很难正确实现)。
相反(闭包可以用作对象)很少被观察到,但是它是一种非常强大的技术... 例如(Python)
def P2d(x, y):
def f(cmd, *args):
nonlocal x, y
if cmd == "x": return x
if cmd == "y": return y
if cmd == "set-x": x = args[0]
if cmd == "set-y": y = args[0]
return f