Steuerungsstrukturen

Die Erweiterungsfunktionssprache stellt die üblichen Anweisungen zur Steuerung der Programmausführung bereit.

  • Wenn dann sonst
  • Während Do und Wiederholen bis
  • Numerisch Für
  • Pause/Untbr
  • Gehe zu

Wenn dann sonst

Wenn Anweisungen wählen Sie Blöcke von Anweisungen, die auf einer oder mehreren Bedingungen ausgeführt werden sollen. Es gibt drei Formen:

Wenn dann Formular

if expression then
     statements to execute if expression is not false or nil
end
<!--NeedCopy-->

Wenn dann sonst Formular

if expression then
     statements to execute if expression is not false or nil
else
     statements to execute if expression is false or nil
end
<!--NeedCopy-->

Wenn dann andernfalls Formular

if expression1 then
     statements to execute if expression1 is not false or nil
     elseif expression2 then
          statements to execute if expression2 is not false or nil
. . .
else
     statements to execute if all expressions are false or nil
end
<!--NeedCopy-->

Beispiel:

if headers[name] then

     local next_value_index = #(headers[name]) + 1
     headers[name][next_value_index] = value

else

     headers[name] = {name .. ":" .. value}

end
<!--NeedCopy-->

Hinweis:

  • Der Ausdruck ist nicht in Klammern eingeschlossen, wie es in C und Java der Fall ist.
  • Es gibt kein Äquivalent zur C/Java switch-Anweisung. Sie müssen eine Reihe von if elseif-Anweisungen verwenden, um das Äquivalent zu tun.

Während Do und Wiederholen bis

Die while- und repeat-Anweisungen stellen Schleifen bereit, die von einem Ausdruck gesteuert werden.

while expression do
     statements to execute while expression is not false or nil
end

repeat

     statements to execute until expression is not false or nil

until expression
<!--NeedCopy-->

Beispiel für while:

local a = {1, 2, 3, 4}
local sum, i = 0, 1 -- multiple assignment initializing sum and i
while i <= #a do -- check if at the end of the array
     sum = sum + a[i] -- add array element with index i to sum
     i = i + 1 -- move to the next element
end
<!--NeedCopy-->

Beispiel für Wiederholung:

sum, i = 0, 1 -- multiple assignment initializing sum and i
repeat
     sum = sum + a[i] -- add array element with index i to sum
     i = i + 1 -- move to the next element
until i > #a -- check if past the end of the array
<!--NeedCopy-->

Natürlich ist es möglich, eine Schleife zu schreiben, die nicht beendet, zum Beispiel, wenn Sie die i = i + 1 Anweisung in einem dieser Beispiele weglassen. Wenn eine solche Funktion ausgeführt wird, erkennt Citrix ADC, dass die Funktion nicht innerhalb eines angemessenen Zeitraums abgeschlossen wurde, und beendet sie mit einem Laufzeitfehler:

Cpu limit reached. Terminating extension execution in [[string "function extension function..."]]: line line-number.

wird in /var/log/ns.log gemeldet.

Numerisch Für

Es gibt zwei Arten von for-Schleifen. Die erste ist die numerische für, die der üblichen Verwendung der for -Anweisung in C und Java ähnelt. Die numerische for -Anweisung initialisiert eine Variable, testet, ob die Variable einen endgültigen Wert übergeben hat, und wenn nicht einen Block von Anweisungen, erhöht die Variable und wiederholt. Die Syntax für die numerische for-Schleife lautet:

for variable = initial, final, increment do

     statements in the loop body

end
<!--NeedCopy-->

wobei initiale, final und increment alle Ausdrücke sind, die Zahlen ergeben (oder in). Variable wird als lokal für den for-Schleifen-Anweisungsblock angesehen; sie kann nicht außerhalb der Schleife verwendet werden. Inkrement kann weggelassen werden; der Standardwert ist 1. Die Ausdrücke werden einmal am Anfang der Schleife ausgewertet. Die terminierende Bedingung ist variabel > final, wenn das Inkrement positiv ist, und variabel < final, wenn das Inkrement negativ ist. Die Schleife endet sofort, wenn das Inkrement 0 ist.

Beispiel (entspricht den while- und Wiederholungsschleifen im vorhergehenden Abschnitt):

sum = 0
for i = 1, #a do -- increment defaults to 1
     sum = sum + a[i]
end
<!--NeedCopy-->

Der zweite Typ von for-Schleife ist das generische für, das für flexiblere Arten von Schleifen verwendet werden kann. Es beinhaltet die Verwendung von Funktionen, so wird später diskutiert werden, nachdem Funktionen eingeführt wurden.

Pause/Untbr

Die break-Anweisung wird innerhalb einer while, repeat oder for-Schleife verwendet. Es wird die Schleife beenden und die Ausführung bei der ersten Anweisung nach der Schleife fortsetzen. Beispiel (auch äquivalent zu den vorherigen while, repeat, and for-Schleifen):

sum, i = 0, 1
while true do
     if i > #a then
          break
     end
     sum = sum + a[i]
     i = i + 1
end
<!--NeedCopy-->

Gehe zu

Die goto-Anweisung kann verwendet werden, um vorwärts oder rückwärts zu einer Beschriftung zu springen. Das Label ist ein Bezeichner und seine Syntax lautet:: label::. Die goto-Anweisung ist goto label. Beispiel (noch einmal äquivalent zu den vorherigen Schleifen):

sum, i = 0, 1
::start_loop::
     if i > #a then
          goto end_loop -- forward jump
     end
     sum = sum + a[i]
     i = i + 1
     goto start_loop -- backwards jump
::end_loop::
. . .
<!--NeedCopy-->

Es gab eine lange anhaltende Kontroverse über die Verwendung von gotos in der Programmierung. Im Allgemeinen sollten Sie versuchen, die anderen Steuerstrukturen zu verwenden, um Ihre Funktionen lesbarer und zuverlässiger zu machen. Aber gelegentlich vernünftige Verwendung von gotos kann zu besseren Programmen führen. Insbesondere kann gotos bei der Handhabung von Fehlern nützlich sein.

Steuerungsstrukturen