功能

函数是编程的基本构建块——它们是对执行任务的语句进行分组的一种方便而强大的方式。它们是Citrix ADC设备和扩展代码之间的接口。对于策略,定义策略扩展函数。对于协议,为协议行为实现回调函数。函数由函数定义和函数调用组成,函数定义指定将哪些值传入和传出函数,以及为函数运行哪些语句,函数调用使用特定的输入数据运行函数并从函数获得结果。

协议行为回调函数

TCP客户端行为由一个处理TCP客户端数据流事件的回调函数(on_data)组成。为了实现基于TCP协议的MBLB (Message Based Load Balancing)功能,可以为该回调函数添加代码,处理来自客户端的TCP数据流,并将字节流解析为协议消息。

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

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

TCP客户端回调函数原型:

函数客户端on_data (ctxt, payload) //。代码结束

在那里,

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

策略扩展功能

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

函数自类型:Function -name(parameter1: parameter1-type,等等):返回类型语句end 

在那里,

类型有NSTEXT、NSNUM、NSBOOL或NSDOUBLE。

Self-type是传递给函数的隐式自形参的类型。当扩展函数在Citrix ADC策略表达式中使用时,这是由函数左侧的表达式生成的值。另一种看待这一点的方法是,该函数在Citrix ADC策略语言中扩展了该类型。

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

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

例子:

函数NSTEXT:COMBINE_HEADERS(): NSTEXT

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

HTTP.REQ.FULL_HEADER.AFTER_STR(“HTTP / 1.1 \ r \ n”).COMBINE_HEADERS ()

这里的自参数是的结果HTTP.REQ.FULL_HEADER.AFTER_STR(“HTTP / 1.1 \ r \ n”),这是一个文本值。COMBINE_HEADERS()调用的结果是文本,因为在这个调用的右边没有任何东西,所以整个表达式的结果是文本。

局部函数定义

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

局部函数function-name(parameter1-name, parameter2-name,等等)语句结束

函数名和参数名都是标识符。(函数名实际上是一个变量,函数语句是局部function-name = function(parameter1,等等)的简写,但使用函数时不需要理解这个微妙之处。)

注意,这里使用的and so是为了延续参数名的模式,而不是通常的... .这是因为…本身实际上意味着一个变量参数列表,这里不讨论。

函数体和返回

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

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

Return——返回空返回表达式——一个返回值返回expression1, expression2,…——多个返回值

例子:

本地函数fsum(a) local sum = 0 for i = 1, #a do sum = sum + a[i] end返回sum end, #a do sum = sum + a[i] end返回sum/#a end 

函数调用

函数调用运行函数体,为其参数提供值,并接收结果。函数调用的语法是function-name(expression1, expression2,等等),其中函数参数被设置为相应的表达式。表达式和参数的数量不必相同。如果表达式少于参数,剩余的参数将被设置为nil。所以你可以在调用的最后设置一个或多个参数为可选的,你的函数可以通过检查它们是否为nil来检查它们是否被指定。一种常见的方法是使用OR操作:

函数f(p1, p2)——p2是可选的p2 = p2或0——如果p2为空,则设置为默认值0…结束< !——NeedCopy >

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

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

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

迭代器函数和泛型for循环

既然我们已经介绍了函数,我们可以讨论泛型for循环。泛型for循环(只有一个变量)的语法是:

对于迭代器中的变量(parameter1, parameter2,等等),在For循环体中执行语句end 

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

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

例子:

Local t = {k1 = "v1", k2 = "v2", k3 = "v3"} Local a ={}——array to accumulate key-value对Local n = 0——key的key-value对的数量,value in pair (t) do n = n + 1 a[n] = key..= ".. "Value——向数组end local s = table中添加键值对。Concat (a, ";")——将所有键值对连接到一个字符串

另一个有用的迭代器是string.gmatch ()函数,在下面使用COMBINE_HEADERS ()的例子。

功能