2011-01-17 11 views

Antwort

22

Es gibt 3 Verwendungen für scope in D.

  1. scope Aussagen. Verwenden Sie dazu scope(success), scope(failure) oder scope(exit). Die Anweisungen in dem folgenden Block werden ausgeführt, wenn der Gültigkeitsbereich der scope-Anweisung beendet wird, wenn keine Ausnahme ausgelöst wird, wenn eine Ausnahme ausgelöst wird oder unabhängig davon, ob eine Ausnahme für Erfolg, Fehler oder Beendigung ausgelöst wird. Diese Verwendung von scope bleibt in der Sprache.

  2. scope auf einer lokalen Variablen. Dies bringt die Variable auf den Stack - auch wenn es sich um eine Klasse handelt. Das Objekt wird zerstört, wenn es den Bereich verlässt. Diese Verwendung von scope ist unsicher und wird schließlich aus der Sprache entfernt (obwohl std.typecons.scoped ersetzt es für diejenigen, die das Leben gefährlich leben wollen).

  3. scope auf einem Funktionsparameter (das ist der Anwendungsfall, nach dem Sie fragen). Wenn er auf einen Parameter platziert wird, der ein Delegat ist, bedeutet dies, dass Verweise auf diesen Parameter nicht maskiert werden können (d. H. Einer globalen Variablen zugewiesen werden können). Und wenn der Compiler dies auf Delegaten sieht, wird vermieden, eine Schließung zuzuweisen, wenn die Adresse einer lokalen Funktion genommen wird. Dies ist wichtig in opApply Schleifen (reference post on newsgroup). Gegenwärtig hat scope keinen Effekt auf andere Funktionsparameter als Delegaten und wird für alle anderen Typen ignoriert, obwohl es irgendwann in der Zukunft erweitert werden kann, um Typen wie Zeiger zu beeinflussen, um zu verhindern, dass sie der Funktion entkommen.

Wenn auf einem Funktionsparameter verwendet, die in Schlüsselwort ist ein Alias ​​für const scope, die häufig, wie scope auf Funktionsparameter versehentlich verwendet wird.

+1

Ich war auf der Suche nach # 3 ... das ist unglaublich! Ich habe mich immer gefragt, wie das geht, danke! :) – Mehrdad

+0

@Lambert: Es scheint, das war nicht auf der D-Website dokumentiert, aber ich habe einen Bericht veröffentlicht, so wird dies wahrscheinlich bald in der Dokumentation hinzugefügt werden. –

+0

@Andrej: Cool, danke! :) – Mehrdad

0

auf dem digitalen Mars Newsgroup-Suche, fand ich zwei halbbezogenen Beitrag über Umfang in diesem Zusammenhang: here und here.

Aus dem Lesen dieser beiden Post scheint Funktion Parameter Umfang nichts nützliches zu tun und es ist da für die Rückwärtskompatibilität. Es klingt sogar wie spätere Versionen, nachdem D2 dieses Qualifikationsmerkmal möglicherweise komplett entfernt hat.