在一个必要的,对象定向语言,会更有意义为具有可变的或不可变的封闭件?

例如:

int i=5;
function() f={print(i);};
f();
i=6;
f();

如果封闭件是可变的,这将打印:

5
6

如果它是不可变的,这将打印:

5
5

我意识到,即使不变关闭,你仍然可以做到这一点:

class I {int i;}
I i=new I();
i.i=5;
function() f={
    I j=i;
    print(j.i);
};
f();
i.i=6;
f();

那么,会是更好的具有可变或不可变的倒闭,或有两个选项?不可改变关闭似乎更容易实现,所以在这一点上,我想我也有去的,除非有一个很好的理由不这样做。

有帮助吗?

解决方案

命令式语言通常构建周围状态的概念。因此它更有意义的语言特性,以反映包括关闭。是的,这种行为有时可能是混乱的,但它的问题和优势,在应用程序中有状态的一部分。

我觉得这个说法的最好证明是看一些有封闭性支持较新的语言。 C#和VB.Net,必须面向对象的语言,选择了具有可变关闭。虽然F#,功能性语言,具有不可改变关闭(主要是从派生的想法,F#是默认不变)。

还有什么将它实际上意味着在命令式语言的不可变封闭?大多数人认为这是使等同于C#的只读变量。当然值类型将被保护,修改,而是可变的引用类型是什么。你不会是能够改变其中变量指向的,但你可以调用不同诱变作用,并得到类似的效果。例如

class Student {
  public string Name { get; set; }
}

void Example() {
  var student = new Student() { Name = "foo" };
  Action() del = () => 
    { student.Name = "bar"; };
  del();
}

这可以用一个不变的闭合来实现的,因为我不实际修改其中的变量指向。但是我显然还是做了变异操作。

其他提示

是应当的语言有lambda表达式由基准值或捕获捕获?自行决定,但看到“在lambda表达式,捕获和可变性”的详细解说。

scroll top