Sie sollten wann immer und wo immer möglich lokale Variablen verwenden. Sie verbessern die Speicherverwaltung des Programms, da der Speicherbereiniger automatisch weiß, wann er sie löschen kann. Darüber hinaus ist der Zugriff auf lokale Variablen viel schneller als auf globale, weil Hollywood nicht den gesamten globalen Code durchsuchen muss und schließlich erhöht es die Lesbarkeit des Programms.
Lokale Variablen haben eine begrenzte Lebensdauer. Sie werden nur in dem Block zur Verfügung stehen, wo man sie deklariert hat. Ein Block wird in der Regel eine Funktion oder Steuerungsstruktur sein. Sie können sogar Blöcke definieren, indem Sie Block und EndBlock verwenden.
Wichtig: Lokale Variablen müssen explizit deklariert werden. Wenn Sie dies nicht tun, wird die Variable automatisch global sein. Zum Beispiel, wenn Sie
Function p_Add(a, b) tmp = a + b Return(tmp) EndFunction |
schreiben, wird tmp
automatisch als globale Variable erstellt werden. Aber
das ist nur eine Verschwendung von Ressourcen, weil Sie die Variable nur innerhalb
der Funktion benötigen. So sollten Sie besser schreiben:
Function p_Add(a, b) Local tmp = a + b Return(tmp) EndFunction |
Nun ist tmp
explizit als lokale Variable deklariert und wird gelöscht, wenn
die Funktion p_Add()
beendet ist.
Wie Sie bereits gesehen haben, werden lokale Variablen mit der Local-Anweisung deklariert. Um eine lokale Variable zu deklarieren, setzten Sie einfach die Anweisung Local vor die Deklaration:
a = 10 ; Globale Variable Local b = 10 ; Lokale Variable |
Wenn Sie mehrere Variablen mit einer Local-Anweisung initialisieren wollen, verwenden Sie einfach Kommas, wie Sie es bei einer normalen Zuordnung tun würden:
a, b = 10, 5 ; Globale Variablen! a erhält 10, b bekommt 5 Local x, y = 10, 5 ; Lokale Variablen! x bekommt10, y erhält 5 |
Sobald Sie eine Variable als lokal deklariert haben, müssen Sie die Local-Anweisung auf diese Variable nicht mehr verwenden oder wiederholen:
; if x > 10, multipliziere mit 2, sonst dividiere mit 2 If x > 10 Local tmp = x ; deklariert die lokale Variable "tmp" tmp = tmp * 2 ; multipliziert die lokale variable "tmp" mit 2 x = tmp ; Wert der lokalen Variable "tmp" wird "x" zugewiesen Else Local tmp = x ; deklariert die lokale Variable "tmp" tmp = tmp / 2 ; dividiert die lokale Variable "tmp" durch 2 x = tmp ; Wert der lokalen Variable "tmp" wird "x" zugewiesen EndIf Print(tmp) ; hier wird 0 ausgegeben, weil "tmp" ist weg |
Der obige Code erzeugt die lokale Variable tmp
in den beiden Blöcken der
If-Anweisung. Danach wird sie multipliziert mit oder dividiert durch 2. Die
Anweisung Local ist da nicht mehr erforderlich, da Hollywood bereits an dieser
Stelle weiß, dass tmp
eine lokale Variable ist. tmp
wird am Ende des If-Blocks
gelöscht, so dass sie in der Zeile Print(tmp)
nicht mehr da ist. tmp
wird
am Ende des If-Blocks zu Nil.
Wenn Sie einer lokalen Variablen keinen Wert zuweisen, wird es den Wert Nil erhalten, aber Hollywood wird wissen, dass es sich um eine lokale Variable handelt, z.B:
If True ; Block wird immer betreten Local x ; deklarieren der lokalen Variable x Print(x) ; gibt 0 aus, da x Nil ist x = 5 ; weist lokalem x 5 zu Print(x) ; gibt jetzt 5 aus EndIf ; x wird hier gelöscht Print(x) ; gibt 0 aus, weil x wieder Nil ist |
Sie können auch den Namen einer globalen Variablen (oder einer lokalen Variable des oberen Blocks) für eine neue lokale Variable verwenden. Zum Beispiel:
a = 50 ; deklariert a als global und wiest ihr 50 zu Block ; begrenzt die nächsten beiden Zeilen als Block Local a = 40 ; deklariert die lokale Variable "a", weist ihr 40 zu NPrint(a) ; gibt 40 aus EndBlock ; lokale Variable "a" wird hier gelöscht NPrint(a) ; gibt 50 aus |
Ein komplexeres Beispiel, die viele Variablen mit dem gleichen Namen verwendet:
x = 10 ; global x (x1 = 10) Block ; neuer Block Local x = x + 1 ; weist 11 der lokalen Variable x zu (x2 = x1 + 1) Block ; neuer Block Local x = x + 1 ; weist 12 der lokalen Variable x zu (x3 = x2 + 1) Block ; neuer Block Local x = x + 1 ; weist 13 der lokalen Variable x zu (x4 = x3 + 1) NPrint(x) ; gibt 13 aus (= x4) EndBlock ; der Bereich von x4 endet hier NPrint(x) ; gibt 12 ais (= x3) EndBlock ; der Bereich von x3 endet hier NPrint(x) ; gibt 11 aus (= x2) EndBlock ; der Bereich von x2 endet hier NPrint(x) ; gibt 10 aus (= x1) |
Dieser Code könnte ein wenig verwirrend aussehen, aber er macht Sinn. In jedem
neuen Block wird die neue lokale Variable x
ausgehend vom aktuellen Rahmen
durch die Variable x
des vorhergehenden Block mit +1 initialisiert.
Es ist zu beachten, dass Sie lokale Variablen nicht zusammen mit Gosub() verwenden können, weil Hollywood bei einer Gosub()-Anweisung aus dem Block springen wird. Bei der Rückkehr haben die Variablen völlig verschiedene Daten. So arbeitet der folgende Code nicht:
;Ungültiger Code Block Local a = 50 ; erstellt lokale Variable "a" Gosub(SUBROUTINE) ; Sprung aus dem Block; "a" wird weg geworfen Print(a) ; lokal "a" hat jetzt irgendein zufälliger Wert EndBlock |
Dies sollte kein großes Problem darstellen, da Gosub() ohnehin seit Hollywood 2.0 veraltet ist und in Ihrem Code nicht mehr verwendet werden sollte. Benutzen Sie nun die Anweisung Function.)
Sie können auch lokale Funktionen nutzen. Sie arbeiten fast in der gleichen Weise. Sie sollten lokale den globalen Funktionen vorziehen, obwohl Sie sie höchstwahrscheinlich nicht so übermäßig verwenden werden, wie Sie lokale Variablen gebrauchen. Aber sie können von Zeit zu Zeit sehr nützlich sein. Siehe Lokale Funktionen für Details.