2013-05-15 8 views
5

In vielen modernen Sprachen const Korrektheit sollte verwendet werden, um Schnittstellen und Absicht zu klären sowie einige Möglichkeiten für den Compiler zu optimieren. In D gibt es die coole Eigenschaft von wirklich unveränderlichen Daten. Wie sollte const und immutable verwendet werden? Ich dachte, dass das const als Qualifikationsmerkmal für Funktionsargumente und immutable für lokale Variablen vorzuziehen scheint eine gute Möglichkeit, Code zu schreiben, aber sobald Sie eine Struktur mit einem Verweis oder Zeiger wie Datenelement (privat oder nicht) zuweisen möchten zu einer unveränderlichen Variable können Sie das nicht tun.Wann und wie soll ich `const` und` unveränderlich` in D verwenden?

struct S { 
    private int[] data; 
} 

void main() { 
    immutable s = new S; // won't work, since members aren't immutable 
} 

Daher kann die Implementierung eines struct Änderung meiner Code brechen, wenn ich unveränderlich verwenden. Soll ich für lokale Variablen const bevorzugen und nur bei Bedarf unveränderlich verwenden? Was sind die Richtlinien?

Antwort

6

Sie sind sehr glücklich - ein Video von DConf2013 mit Präsentation gewidmet, genau zu diesem Thema letzte Woche veröffentlicht wurde: http://youtu.be/mPr2UspS0fE

In Ihrem Fall auto s = new immutable(S)(); sollte es tun. Sie können dann Datenscheibenpunkte im Konstruktor erstellen. Wenn dieser Slice jedoch auf beliebige Daten zeigen kann, dann kann S unmöglich unveränderlich sein, da sowohl const als auch immutable in D transitiv sind - sie bieten sehr starke Garantien nicht nur über die Variable selbst, sondern auch über alle möglichen Daten Zugriff von ihm indirekt über Referenz/Zeiger.

Es ist eigentlich in Linked Video abgedeckt, aber kurze Zusammenfassung ist, dass Sie unveränderlich verwenden möchten, wenn Sie wirklich beabsichtigen. Mit anderen Worten, wenn Sie wollen Ihr Code zu brechen, wenn S Implementierung ändert sich so, dass unveränderliche Garantien nicht mehr gültig sind.