Gibt es eine native Syntax für den Zugriff auf die äußere Funktion Ergebnisvariable aus der inneren Funktion in Delphi?

8

Überlegen Sie:

%Vor%

Gibt es eine native Syntax für den Zugriff auf die Variable OuterFunc Result in InnerFunc? Oder ist der einzige Weg dies zu tun, um es wie ein Parameter zu übergeben, wie im Folgenden?

%Vor%     
Vadim Skormakhovich 07.04.2017, 09:05
quelle

2 Antworten

11

Sie können den Funktionen Funktionen zuweisen, indem Sie sie dem Namen der Funktion zuweisen, die in Pascal ursprünglich so war:

%Vor%

In Ihrem Fall können Sie also

schreiben %Vor%

Beachten Sie jedoch, dass die Verwendung des Funktionsnamens in einem Anweisungsblock Anyware anders als auf der linken Seite des Zuweisungsoperators zu einem rekursiven Aufruf führt und sich daher von der Funktionsweise des vordefinierten Result unterscheidet.

Mit anderen Worten, Sie können nicht auf einen zuvor festgelegten Wert von OuterFunc innerhalb von InnerFunc zugreifen. Sie müssten z.B. eine lokale Variable im äußeren Bereich, die vor InnerFunc definiert wurde, um auch von InnerFunc zugänglich zu sein:

%Vor%

Weitere Informationen finden Sie in Function Declarations in in der Dokumentation .

    
Tom Brunberg 07.04.2017, 09:25
quelle
4

Eine andere Option außer der Verwendung der nativen Pascal-Syntax (wie von Tom Brunbergs Antwort angezeigt) ist das Konvertieren der lokalen Funktion in eine Prozedur.

%Vor%

Da dies Ihre INNER lokale Funktion ist, würden Sie einige externe API / Verträge durch diese einfache Änderung nicht brechen.

Zweimal, denn Ihr ursprünglicher Code hat InnerFunc als De-facto-Prozedur, wobei er weder von calling noch von callee seine eigene Result verwendet.

%Vor%

Aber okay, nehmen wir an, Sie haben nur BEIDE Ergebnisse von BEIDEN Funktionen vergessen, aber Sie hatten ursprünglich vor, dies zu tun. Es gibt jedoch immer noch einige Wege, um die Grenzen der Delphi-Sprache abzuschneiden und zu hacken. Einschränkungen.

Ausgehend von diesem Prozeduransatz können Sie eine Kurzschrift hinzufügen, wenn Sie eine solche Funktion in Ausdrücken verwenden möchten. Obwohl es ein bisschen hässlich aussieht und einen Umleitungsaufruf für die CPU hinzufügt (Sie können keine inline lokalen Funktionen und wenn Sie Delphi Inline-Implementierung mit "Register Dances" stecken), so verlangsamt sich etwas ( aber abhängig davon, wie viel Sie es bei anderer Arbeit nennen - diese zusätzliche Arbeit könnte nicht bemerkbar sein.

%Vor%

Und noch ein weiterer Hack deklariert die Variablen, die sich überlappen.

%Vor%

Nun könnte dieser Ansatz die Optimierungen zunichte machen, wie das "Ergebnis" in die CPU-Register zu legen, wodurch er gezwungen wird, das RAM dafür zu verwenden, was langsamer ist. Wenn Sie einmal den Typ von OuterFunc ändern möchten und Sie vergessen haben, den Typ von Outer_Result var entsprechend zu ändern, haben Sie sich selbst verarscht.

%Vor%

So weniger hackish Weg, um diese Absicht auszudrücken (auf Kosten von Zuteilung und Zugriff noch eine weitere In-RAM-Variable) wäre dies:

%Vor%

Aber all diese Möglichkeiten sind Hack-Arounds, die die konzeptionelle Klarheit sprengen und somit die Fähigkeit für Menschen, das Programm in der Zukunft zu lesen / zu verstehen, behindern. Wenn Sie die Variable benötigen, deklarieren Sie die Variable. Das wäre die klarste Option hier. Afterall-Programme sind mehr für die zukünftigen Programmierer geschrieben, um sie zu lesen, als für die Computer, um sie zu kompilieren. : -)

%Vor%

Auf diese Weise würden Sie nicht mit der Sprache kämpfen, sondern aufgeben und sie so verwenden, wie sie eigentlich verwendet werden sollte. Die Sprache zu bekämpfen und auszutricksen macht immer Spaß, aber auf lange Sicht, wenn man den Code, den ein Mensch zuletzt gelesen hat, vor 5 Jahren pflegen und auf neuere Versionen von Delphi / Bibliotheken / Windows portieren muss - dann ist das der nicht natürliche Smart Tricks neigen dazu, ziemlich nervig zu werden.

    
Arioch 'The 07.04.2017 12:01
quelle

Tags und Links