Warum verwenden Sie eine do-end block in Lua?
Ich versuche, Antworten zu finden, dies aber nicht tun. Ich wollte wissen, was ist die do-end block eigentlich verwendet? Es sagt nur Werte verwendet werden, wenn nötig, mit meinem Buch so, wie könnte ich das?
Kann ich verwenden, um den Gültigkeitsbereich von lokalen Variablen, indem eine Funktion in einer do-Schleife (Ende) und Ort lokale Variablen außerhalb der Funktion, aber in diesem do-end block und den Variablen gesehen werden, die von der Funktion? Aber dann kann die Funktion noch aufgerufen werden?
Sorry, sehr vage. Ich hoffe, das macht Sinn. Vielleicht eine illustrierte Beispiel könnte nützlich sein ^^
Du musst angemeldet sein, um einen Kommentar abzugeben.
Do-end-Blöcke haben zu tun mit dem problem von Variablen (scoping). Im wesentlichen, wenn Sie einen Bezeichner, welchen Wert hat es? Zum Beispiel, welche zahlen werden ausgegeben, wenn wir schreiben das folgende Programm?
Wenn es um lokale Variablen geht, Lua verwendet standard lexical scoping, da ist gut erklärt in Abschnitt 4.2 der Programmierung in Lua Buch. Lexikalische Bereich ist sehr nützlich für ein paar Gründe:
Die variable scoping ist statisch. Sie wissen einfach durch einen Blick auf den Quellcode, was Variablen und Funktionen entsprechen dabei jeden Bezeichner im code. Im Gegensatz dazu steht die dynamische Festlegung des lösungsumfangs finden Sie in der Bash oder indirekten Versand über Methodenaufrufe oder array-lookups, wo Sie brauchen, zu denken, über die Ausführung Fluss des Programms, um zu wissen, welchen Wert Sie am Ende mit.
Variable scoping ist begrenzt, das hilft, die Lesbarkeit und vermeidet einige Fehler:
Wenn Sie eine variable deklarieren, die nur, wenn Sie gehen zu müssen, um es zu verwenden können Sie ihn deklarieren und initialisieren Sie es in der gleichen Zeit. Auf der anderen Seite, wenn Sie erklären, alle deine Variablen am Anfang der Funktion dann könnten Sie am Ende versehentlich mit einem, bevor Sie Sie initialisieren.
Wenn Sie definieren eine variable in einem inneren scope können Sie nicht versehentlich in die äußeren Bereiche.
Lexikalische scoping, können einige sehr ausdrucksstarke Redewendungen, wenn Sie es kombinieren mit verschachtelte Funktionen (closures).
In der Regel, Sie brauchen nicht zu sorgen über die Angabe von Variablen-scopes selbst. Funktionen, Schleifen und Bedingungen automatisch neue Bereiche und werden in der Regel genug für das geben Ihren Variablen sowie der eingeschränkten Umfang. Das heißt, jeder einmal in eine Weile, möchten Sie vielleicht, um die Einführung einige zusätzliche Bereiche aus der Luft zu machen und wir können das tun-Ende für, die. Programmierung Lua hat folgende Beispiel, wo Sie wollen, um die Berechnung der Lösungen einer quadratischen Gleichung und die Berechnung hat einige Provisorien:
Ohne die do-end block
a2
undd
könnte am Ende wird versehentlich verwendet werden, nachdem Sie nicht mehr benötigt werden:Sagte, tun-end muss nicht verwendet werden, die oft. Wenn der code-block ist sehr klein, es ist weniger das Bedürfnis sich zu verstecken die lokalen Variablen und wenn der code-block ist groß, dass es oft der bessere Ansatz ist, um den code-block in einer Routine seine eigene. Die Zeiten, wo ich finde, dass tun-Ende glänzt, wenn Sie nur tun müssen, um die Berechnung einmal - Funktionen können möglicherweise viele Male aufgerufen werden, aber wenn Sie verwenden eine do-end block, den Sie klar machen, dass Sie nur läuft, dass ein Stück code einmal.
Ja,
do end
block kann verwendet werden, um den Umfang der Variablen, um die Funktion verwendet die Variablen sichtbar sind, haben Sie mehrere MöglichkeitenLokalisierung der Variablen hält, dass die Funktion außerhalb des Blocks:
Verwenden Sie eine Globale Funktion:
Methode:
In allen drei Fällen können Sie immer noch rufen
func()
nachdem der block geschlossen ist, abera
ist nur sichtbar aus, dass die Funktion und nicht irgendwo anders.Zusätzlich zu den guten Antworten, die bereits gegeben wurde, möchte ich erwähnen, die Fähigkeit zu teilen eine private variable zwischen zwei oder mehr Funktionen: