Estructuras de control

El lenguaje de la función de extensión proporciona las instrucciones habituales para controlar la ejecución del programa.

  • If Then Else
  • While Do and Repeat Until
  • Numeric For
  • Pausa/Inter
  • GoTo

If Then Else

Si las sentencias seleccionan bloques de sentencias para ejecutar en función de una o más condiciones. Hay tres formas:

If then Form

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

If then else Form

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-->

If then elseif else Form

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-->

Ejemplo:

if headers[name] then

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

else

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

end
<!--NeedCopy-->

Nota:

  • La expresión no está entre paréntesis como es el caso en C y Java.
  • No hay equivalente a la instrucción C/Java switch. Tiene que usar una serie de sentencias if elseif para hacer el equivalente.

While Do and Repeat Until

Las sentencias while y repeat proporcionan bucles controlados por una expresión.

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-->

Ejemplo de 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-->

Ejemplo de repeat:

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-->

Por supuesto, es posible escribir un bucle que no termine, por ejemplo, si omite la instrucción i = i + 1 en cualquiera de estos ejemplos. Cuando se ejecuta una función de este tipo, Citrix ADC detectará que la función no se completó en un tiempo razonable y la matará con un error de tiempo de ejecución:

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

se informará en /var/log/ns.log.

Numeric For

Hay dos tipos de bucles for. El primero es el numérico para, que es similar al uso habitual de la declaración for en C y Java. La instrucción for numérica inicializa una variable, comprueba si la variable ha pasado un valor final y, si no, ejecuta un bloque de sentencias, incrementa la variable y se repite. La sintaxis para el bucle numérico for es:

for variable = initial, final, increment do

     statements in the loop body

end
<!--NeedCopy-->

donde inicial, final e incremento son todas las expresiones que producen (o se pueden convertir a) números. variable se considera que es local para el bloque de sentencia de bucle for; no se puede utilizar fuera del bucle. incremento se puede omitir; el valor predeterminado es 1. Las expresiones se evalúan una vez al principio del bucle. La condición de terminación es variable > final si el incremento es positivo y variable < final si el incremento es negativo. El bucle termina inmediatamente si el incremento es 0.

Ejemplo (equivalente a los bucles while y repeat en la sección anterior):

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

El segundo tipo de bucle for es el genérico para, que se puede utilizar para tipos de bucles más flexibles. Implica el uso de funciones, por lo que se discutirá más adelante después de que se hayan introducido las funciones.

Pausa/Inter

La sentencia break se utiliza dentro de un bucle while, repeat o for. Terminará el bucle y reanudará la ejecución en la primera declaración después del bucle. Ejemplo (también equivalente al anterior while, repeat y for loops):

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

GoTo

La instrucción goto se puede utilizar para saltar hacia adelante o hacia atrás a una etiqueta. La etiqueta es un identificador y su sintaxis es:: Label:. La instrucción goto es goto label. Ejemplo (una vez más equivalente a los bucles anteriores):

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-->

Ha habido una larga controversia sobre el uso de gotos en la programación. En general, debe intentar usar las otras estructuras de control para que sus funciones sean más legibles y confiables. Pero el uso juicioso ocasional de gotos puede conducir a mejores programas. En particular, los gotos pueden ser útiles en el manejo de errores.

Estructuras de control