函数

函数是编程的基本构建块-它们是对执行任务的语句进行分组的方便和强大的方式。它们是 Citrix ADC 设备和扩展代码之间的接口。对于策略,您可以定义策略扩展函数。对于协议,您可以为协议行为实现回调函数。函数由函数定义组成,这些定义指定了函数传入和传出函数的值以及为函数执行的语句,以及函数调用,后者执行具有特定输入数据的函数并从函数中获取结果。

协议行为回调函数

TCP 客户端行为由处理 TCP 客户端数据流事件的回调函数 (on_data) 组成。要为基于 TCP 的协议实施基于消息的负载平衡 (MBLB),您可以为此回调函数添加代码,以处理来自客户端的 TCP 数据流并将字节流解析为协议消息。

行为中的回调函数使用上下文调用,即处理模块状态。上下文是处理模块的实例。例如,对于不同的客户端 TCP 连接,使用不同的上下文调用 TCP 客户端行为回调。

除了上下文之外,行为回调还可以有其他参数。通常,其余的参数作为有效载荷传递,这是所有参数的集合。因此,可编程处理模块实例可以看作是实例状态加事件回调函数的组合,即上下文加行为。流量作为事件有效载荷通过管道。

TCP 客户端回调函数的原型:

函数                客户端上的数据(ctxt,有效负载)

//.code

结束

其中,

  • ctxt -TCP 客户端处理上下文
  • 有效负载 — 事件有效负载
    • 负载 .data -接收到的 TCP 数据,以字节流形式提供

策略推广职能

由于 NetScaler 策略表达式语言是强类型的,因此扩展函数的定义必须指定其输入的类型及其返回值。Lua 函数定义已扩展到包括以下类型:

function self-type:function-name(parameter1: parameter1-type, etc.): return-type
     statements
end

where,

the types are NSTEXT, NSNUM, NSBOOL, or NSDOUBLE.

自我类型是传递给函数的隐式自我参数的类型。在 Citrix ADC 策略表达式中使用扩展函数时,这是函数左侧的表达式生成的值。查看此功能的另一种方法是,该函数在 Citrix ADC 策略语言中扩展了该类型。

参数类型是策略表达式中扩展函数调用中指定的每个参数的类型。扩展函数可以有零个或多个参数。

return-type 是扩展函数调用返回的值的类型。它将是函数右侧的策略表达式部分(如果有)的输入,否则是表达式结果的值。

示例:

function NSTEXT:COMBINE_HEADERS() : NSTEXT

在策略表达式中使用扩展函数:

HTTP.REQ.FULL_HEADER.AFTER_STR("HTTP/1.1rn").COMBINE_HEADERS()

这里的自我参数是 HTTP.REQ.FULL_HEADER.AFTER_STR(“HTTP/1.1rn”) 的结果,它是一个文本值。COBINE_HETADS () 调用的结果是文本,并且由于此调用的右侧没有任何内容,所以整个表达式的结果是文本。

局部函数定义

除了扩展函数之外,不能在扩展文件中定义全局函数。但局部函数可以使用普通的 Lua 函数语句在扩展函数中定义。这声明函数的名称及其参数的名称(也称为参数),并且像 Lua 中的所有声明一样,没有指定任何类型。这个语法是:

local function function-name(parameter1-name, parameter2-name, etc.)
     statements
end

函数和参数名称都是标识符。(函数名实际上是一个变量,函数语句是本地函数名称 = function(parameter1, etc.) 的速记,但是您不必了解这个微妙之处来使用函数。)

请注意,等等用于延续参数名称的模式,而不是通常的…。这是因为… 本身实际上意味着一个变量参数列表,这里不会讨论。

功能体和返回

函数和结束语句之间的语句块是函数体。在函数体中,函数参数的作用类似于局部变量,函数调用提供的值,如前所述。

return 语句提供要返回给函数调用者的值。它必须出现在块的末尾(在函数中,如果然后,for 循环,等等; 它可以在自己的块做返回… end)。它可以指定无、一个或多个返回值:

return -- returns nil
return expression -- one return value
return expression1, expression2, ... -- multiple return values

示例:

local function fsum(a)
     local sum = 0
     for i = 1, #a do
          sum = sum + a[i]
     end
     return sum
end

local function fsum_and_average(a)
     local sum = 0
     for i = 1, #a do
          sum = sum + a[i]
     end
     return sum, sum/#a
end

函数调用

函数调用执行函数的主体,为其参数提供值并接收结果。函数调用的语法是函数名称(expression1、expression2 等),其中函数参数设置为相应的表达式。表达式和参数的数量不一定相同。如果表达式少于参数,则其余参数设置为 nil。因此,您可以在调用结束时使一个或多个参数可选,并且您的函数可以通过检查它们是否不是零来检查它们是否被指定。执行此操作的常见方法是使用或操作:

function f(p1, p2) -- p2 is optional
     p2 = p2 or 0 -- if p2 is nil, set to a default of 0
     . . .
end

如果表达式多于参数,则会忽略其余表达式值。

如前所述,函数可以返回多个值。这些返回可以在多赋值语句中使用。示例:

local my_array = {1, 2, 3, 4}
local my_sum, my_ave = sum_and_average(my_array)

迭代器函数和通用 for 循环

现在我们已经引入了函数,我们可以讨论泛型 for 循环。通用 for 循环(带有一个变量)的语法是:

for variable in iterator(parameter1, parameter2, etc.) do
     statements in the for loop body
end

其中,iterator()是一个具有零个或多个参数的函数,它在循环体的每次迭代中为变量提供了一个值。迭代器函数使用称为闭包的技术来跟踪它在迭代中的位置,您不必担心这里。它通过返回 nil 来表示迭代的结束。迭代器函数可以返回多个值,用于多个赋值。

编写一个迭代器函数超出了本文的范围,但有许多有用的内置迭代器来说明这个概念。一个是对()迭代器,它遍历表中的条目并返回两个值,即下一个条目的键和值。

示例:

local t = {k1 = "v1", k2 = "v2", k3 = "v3"}
local a = {} -- array to accumulate key-value pairs
local n = 0 -- number of key-value pairs
for key, value in pairs(t) do
     n = n + 1
     a[n] = key .. " = " .. value -- add key-value pair to the array
end
local s = table.concat(a, "; ") -- concatenate all key-value pairs into one string

另一个有用的迭代器是字符串 .gmatch () 函数,它将在下面的 COBINE_HADS () 示例中使用。

函数