This content has been machine translated dynamically.
Dieser Inhalt ist eine maschinelle Übersetzung, die dynamisch erstellt wurde. (Haftungsausschluss)
Cet article a été traduit automatiquement de manière dynamique. (Clause de non responsabilité)
Este artículo lo ha traducido una máquina de forma dinámica. (Aviso legal)
此内容已动态机器翻译。 放弃
このコンテンツは動的に機械翻訳されています。免責事項
This content has been machine translated dynamically.
This content has been machine translated dynamically.
This content has been machine translated dynamically.
This article has been machine translated.
Dieser Artikel wurde maschinell übersetzt. (Haftungsausschluss)
Ce article a été traduit automatiquement. (Clause de non responsabilité)
Este artículo ha sido traducido automáticamente. (Aviso legal)
この記事は機械翻訳されています.免責事項
이 기사는 기계 번역되었습니다.
Este artigo foi traduzido automaticamente.
这篇文章已经过机器翻译.放弃
Translation failed!
函数
函数是编程的基本构建块-它们是对执行任务的语句进行分组的方便和强大的方式。它们是 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 () 示例中使用。
分享:
分享:
This Preview product documentation is Citrix Confidential.
You agree to hold this documentation confidential pursuant to the terms of your Citrix Beta/Tech Preview Agreement.
The development, release and timing of any features or functionality described in the Preview documentation remains at our sole discretion and are subject to change without notice or consultation.
The documentation is for informational purposes only and is not a commitment, promise or legal obligation to deliver any material, code or functionality and should not be relied upon in making Citrix product purchase decisions.
If you do not agree, select Do Not Agree to exit.