-
23-08-2019 - |
题
在一个必要的,对象定向语言,会更有意义为具有可变的或不可变的封闭件?
例如:
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表达式,捕获和可变性一>”的详细解说。
不隶属于 StackOverflow