感谢您提供反馈

这篇文章已经过机器翻译.放弃

控制结构

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

  • 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 可能在处理错误时有用。

本内容的正式版本为英文版。部分 Cloud Software Group 文档内容采用了机器翻译,仅供您参考。Cloud Software Group 无法控制机器翻译的内容,这些内容可能包含错误、不准确或不合适的语言。对于从英文原文翻译成任何其他语言的内容的准确性、可靠性、适用性或正确性,或者您的 Cloud Software Group 产品或服务沿用了任何机器翻译的内容,我们均不作任何明示或暗示的保证,并且适用的最终用户许可协议或服务条款或者与 Cloud Software Group 签订的任何其他协议(产品或服务与已进行机器翻译的任何文档保持一致)下的任何保证均不适用。对于因使用机器翻译的内容而引起的任何损害或问题,Cloud Software Group 不承担任何责任。
控制结构