这篇文章已经过机器翻译.放弃
控制结构
扩展函数语言提供控制程序执行的常用语句。
- 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
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
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
示例:
if headers[name] then
local next_value_index = #(headers[name]) + 1
headers[name][next_value_index] = value
else
headers[name] = {name .. ":" .. value}
end
注意:
- 该表达式不像 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
举个例子:
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
重复示例:
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
当然,可以编写一个不终止的循环,例如,如果您在这两个示例中省略了 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
其中,初始、最终和增量都是产生(或可以转换为)数字的表达式。变量被认为是 for 循环语句块的局部表达式;它不能在循环之外使用。增量可以省略;默认值为 1。在循环开始时对表达式进行一次求值。如果增量为正,则终止条件为变量 > 最终值;如果增量为负,则终止条件为变量 < final。如果增量为 0,则循环立即终止。
示例(等同于上一节中的 while 和重复循环):
sum = 0
for i = 1, #a do -- increment defaults to 1
sum = sum + a[i]
end
第二种类型的 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
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::
. . .
关于在编程中使用 gotos 一直存在争议。一般来说,您应该尝试使用其他控制结构来使您的函数更具可读性和可靠性。但是偶尔明智地使用 gotos 可能会带来更好的程序。特别是,gotos 可能在处理错误时有用。