Damit eine Groovy-Closure eine im Rahmen eines Delegates definierte Variable ändern kann, müssen Sie explizit delegate.theVariableName angeben?

8

Ich stolperte auf etwas mit Groovy-Schließungen und Delegaten, von denen ich nicht sicher bin, ob es ein offizieller Teil der Sprache ist oder vielleicht sogar ein Bug.

Grundsätzlich definiere ich eine Schließung, die ich als String von einer externen Quelle eingelesen habe, und eine der Variablen in der Klasse, die den Abschluss definiert, muss durch den Abschluss geändert werden. Ich hab geschrieben Ein einfaches Beispiel, das zeigt, was ich gefunden habe und was nicht funktioniert.

Wenn Sie sich den folgenden Testcode ansehen, sehen Sie eine Klasse, die eine Variable definiert

%Vor%

und zwei Closures, die während der Laufzeit von Strings definiert wurden, die versuchen, die Tiervariable zu ändern.

Das funktioniert & gt;

%Vor%

Aber das ist nicht

%Vor%

Es scheint so, als müsste ich meine zu ändernde Variable explizit mit 'Delegate' qualifizieren. damit dies funktioniert. (Ich denke, ich kann auch einen Setter in der einschließenden Klasse definieren, damit die Schließung den Wert ändert.)

Also ... Ich habe herausgefunden, wie das funktioniert, aber es würde mich interessieren, wenn mich jemand auf etwas Grooviges hinweisen könnte doc erklärt die Regeln dahinter.

Speziell .... warum wird die einfache Zuordnung

%Vor%

beeinflusst die ursprüngliche Variable? Werden hier Schattenkopien gemacht oder so?

%Vor%     
Chris Bedford 30.08.2012, 20:36
quelle

1 Antwort

7

Groovy Closures haben fünf Strategien zum Auflösen von Symbolen innerhalb von Closures:

  • OWNER_FIRST : Der Eigentümer (wo die Schließung definiert ist) wird zuerst überprüft, dann der Delegat
  • OWNER_ONLY : Der Eigentümer ist geprüft, der Delegat wird nur überprüft, wenn explizit darauf verwiesen wird
  • DELEGATE_FIRST : Der Delegat wird zuerst überprüft, dann der Eigentümer
  • DELEGATE_ONLY : Der Delegat wird zuerst geprüft, der Eigentümer wird nur überprüft, wenn explizit darauf verwiesen wird
  • TO_SELF : Weder Delegat noch Eigentümer sind geprüft

Der Standardwert ist OWNER_FIRST . Da die Schließung dynamisch definiert ist, ist Ihr Eigentümer ein Script-Objekt, das selbst spezielle Regeln hat. Wenn Sie animal = 'bear' in einem Skript schreiben, wird tatsächlich eine neue Bindung mit dem Namen animal erstellt und 'bear' zugewiesen.

Sie können Ihre Tests so anpassen, dass sie nicht explizit auf den Delegaten verweisen, indem Sie einfach die Auflösungsstrategie für den Abschluss ändern, bevor Sie sie aufrufen:

%Vor%

Dies vermeidet die seltsame Skriptbindung und verwendet den Delegaten wie erwartet.

    
ataylor 30.08.2012, 20:51
quelle

Tags und Links