控制结构

扩展函数语言提供控制程序执行的常用语句。

  • If Then Else
  • While Do and Repeat Until
  • 数值为
  • 休息
  • Goto

If Then Else

if 语句根据一个或多个条件选择要执行的语句块。有三种形式:

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

示例:

if headers[name] then

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

else

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

end
<!--NeedCopy-->

注意:

  • 该表达式不像 C 和 Java 中那样用括号括起来。
  • 没有与 C/Java 切换语句等效的语句。您必须使用一系列 if elseif 语句来执行等效的操作。

While Do and Repeat Until

whil e 和 re p eat 语句提供由表达式控制的循环。

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

举个例子:

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

重复示例:

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

当然,可以编写一个不终止的循环,例如,如果您在这两个示例中省略了 i = i + 1 语句。当执行这样的函数时,NetScaler 将检测到该函数未在合理的时间内完成,并会因运行时错误将其终止:

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

将在 /var/log/ns.log 中报告。

数值为

有两种类型的 for 循环。第一个是数字 for,它与 C 和 Java 中的 for 语句的常用用法类似。numeric for 语句初始化变量,测试该变量是否传递了最终值,如果没有,则执行一块语句,递增该变量,然后重复。数字 for 循环的语法为:

for variable = initial, final, increment do

     statements in the loop body

end
<!--NeedCopy-->

其中,初始、最终和增量都是产生(或可以转换为)数字的表达式。变量被认为是 for 循环语句块的局部表达式;它不能在循环之外使用。增量可以省略;默认值为 1。在循环开始时对表达式进行一次求值。如果增量为正,则终止条件为变量 > 最终值;如果增量为负,则终止条件为变量 < final。如果增量为 0,则循环立即终止。

示例(等同于上一节中的 while 和重复循环):

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

第二种类型的 for 循环是通用的 for,它可用于更灵活的循环类型。它涉及函数的使用,因此将在函数引入后讨论。

休息

break 语句在 while、repeat 或 for 循环中使用。它将终止循环并在循环之后的第一条语句处恢复执行。示例(也等同于前面的 while、repeat 和 for 循环):

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

Goto

goto 语句可用于向前或向后跳转到标签。标签是一个标识符,其语法为 ::label::。goto 语句是 goto 标签。示例(再次等同于前面的循环):

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

关于在编程中使用 gotos 一直存在争议。一般来说,您应该尝试使用其他控制结构来使您的函数更具可读性和可靠性。但是偶尔明智地使用 gotos 可能会带来更好的程序。特别是,gotos 可能在处理错误时有用。

控制结构