Frage

In einem Imperativ, Objekt ausrichtet Sprache, würde mehr Sinn macht wandelbar oder unveränderlich Schließungen haben?

Zum Beispiel:

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

Wenn der Verschluss wandelbar ist, würde dies drucken:

5
6

Wenn es unveränderlich ist, wäre es drucken:

5
5

Ich stelle fest, dass auch bei unveränderlichen Schließungen, könnten Sie dies noch tun:

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

Also, wäre es besser, wandelbar zu haben, oder unveränderlich Schließungen oder haben die Möglichkeit, für beide? Unveränderliche Schließungen scheinen leichter zu implementieren, an dieser Stelle so, ich glaube, ich damit gehen werde, es sei denn es einen guten Grund nicht ist.

War es hilfreich?

Lösung

Imperative Sprachen werden in der Regel um das Konzept des Staates errichtet. Daher macht es Sinn für Sprache Funktionen, die zu reflektieren, einschließlich der Verschlüsse. Ja, kann dieses Verhalten manchmal verwirrend sein, aber es ist ein Teil des Problems und Vorteils Zustand in Ihrer Anwendung zu haben.

Ich denke, der beste Beweis für dieses Argument auf einige der neueren Sprachen suchen ist, die Schließung Unterstützung. Sowohl C # und VB.Net, imperative OO-Sprachen, wählten wandelbar Verschlüsse haben. Während F #, eine funktionale Sprache, unveränderliche Verschlüsse hat (vor allem von dem Gedanken, dass Herleiten F # standardmäßig unveränderlich ist).

Auch das, was es bedeuten würde, tatsächlich eine unveränderliche Schließung in einer imperativen Sprache haben? Die meisten Leute denken, dies als die Variablen äquivalent zu C # 's nur lesbar zu machen. Sicher Werttypen von Verfälschungen geschützt, aber was ist wandelbar Referenztypen würden. Sie wäre in der Lage, nicht zu ändern, wo die Variable zu spitz, aber man konnte eine Änderungsfunktion aufrufen und einen ähnlichen Effekt erzielen. Zum Beispiel.

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

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

Dies mit einer unveränderlichen Schließung könnte implementiert, wie ich eigentlich nicht ändern, wo die Variablen zu verweisen. Allerdings bin ich eindeutig noch ein Mutieren Betrieb zu tun.

Andere Tipps

Müssen Sprachen haben lambdas, dass der Fang von Wert oder Capture durch Verweis? Entscheiden Sie selbst, aber „ Auf lambdas, erfassen sehen, und Veränderlichkeit “für weitere Erläuterungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top