控制结构
扩展函数语言提供控制程序执行的常用语句。
- 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 可能在处理错误时有用。