-
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();
}
変数が指す場所を、私は実際には変更しないように、これは不変の閉鎖を実施することができます。しかし、私は明らかにまだ変異操作をしています。
他のヒント
言語は参照による値またはキャプチャすることにより、そのキャプチャラムダを持っているはず?自分で決めるが、ラムダ、キャプチャ、および可変性で「を見ますA>」より解説のため。