関数

関数はプログラミングの基本的な構成要素であり,タスクを実行するステートメントをグループ化するための便利で強力な方法です。これらは,Citrix ADCアプラアンスと拡張コドの間のンタフェスです。ポリシ,の場合は,ポリシ,拡張関数を定義します。プロトコルの場合は,プロトコルの動作のコ,ルバック関数を実装します。関数は、関数との間で渡される値と関数に対して実行されるステートメントを指定する関数定義と、特定の入力データを持つ関数を実行し、関数から結果を取得する関数呼び出しで構成されます。

プロトコル動作コ,ルバック関数

TCPクライアントの動作は,TCPクライアントデータストリームイベントを処理するコールバック関数(on_data)で構成されます。TCPベースのプロトコルに基于消息的负载平衡(MBLB)を実装するには,このコールバック関数のコードを追加して,クライアントからのTCPデータストリームを処理し,バイトストリームをプロトコルメッセージに解析します。

ビヘビア内のコルバック関数は,処理モジュルの状態であるコンテキストで呼び出されます。コンテキストは,処理モジュ,ルの,ンスタンスです。たとえば,TCPクライアント動作コールバックは,クライアントTCP接続ごとに異なるコンテキストで呼び出されます。

コンテキストに加えて,ビヘことができます。通常,残りの引数はペ。ペ。したがって,プログラマブル処理モジュールのインスタンスは,インスタンス状態とイベントコールバック関数,つまりコンテキストと動作の組み合わせとして見ることができます。トラフィックは▪▪ベントペ▪▪ロ▪ドとしてパ▪▪プラ▪▪ンを通過します。

tcpクラeconeconアントコ,ルバック関数のプロトタeconeconプ:

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

各項目の意味は次のとおりです。

  • ctxt -TCPクラeprアント処理コンテキスト
  • 有效负载:econpベントペeconpロ,econpド
    • 有效载荷。d ata-受信したTCPデタ。バ▪▪トストリ▪▪ムとして利用できます。

ポリシ,拡張関数

NetScalerポリシー表現言語は厳密に型付けされているため,拡張関数の定義では,入力の種類と戻り値を指定する必要があります。Lua関数定義は,次の型を含むように拡張されました。

function self-type:function-name(parameter1: parameter1-type,等等):return-type语句结束的地方,类型是NSTEXT, NSNUM, NSBOOL或NSDOUBLE。<!——NeedCopy >

self型は,関数に渡される暗黙のselfパラメ,タの型です。Citrix ADCポリシー式で拡張関数を使用する場合、これは関数の左側にある式によって生成された値です。これを表示するもう 1 つの方法は、この関数によってCitrix ADCポリシー言語でそのタイプが拡張されることです。

パラメ,タ型は,ポリシ,式で拡張関数呼び出しで指定された各パラメ,タの型です。拡張関数は,0個以上のパラメタを持ことができます。

返回类型は,拡張関数呼び出しによって返される値の型です。ポリシ,式の部分(ある場合)への入力であり,関数の右側に入力されます。それ以外の場合は,式の結果の値です。

例:

函数NSTEXT:COMBINE_HEADERS(): NSTEXT

ポリシ,表現での拡張関数の使用:

rn HTTP.REQ.FULL_HEADER.AFTER_STR(“HTTP / 1.1”).COMBINE_HEADERS ()

ここで自己パラメータは,テキスト値であるHTTP.REQ.FULL_HEADER.AFTER_STR (rn HTTP / 1.1)の結果です。COMBINE_HEADERS()呼び出しの結果はテキストであり,この呼び出しの右側には何もないため,式全体の結果はテキストになります。

ロ,カル関数定義

拡張関数のほかに,拡張ファ。しかし,ロ,カル関数は,通常のLuaの関数文を使用して拡張関数内で定義することができます。これは,関数の名前とそのパラメータの名前(引数とも呼ばれます)を宣言し,Luaのすべての宣言と同様に,任意の型を指定しません。この構文は次のとおりです。

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

関数名とパラメ,タ名はすべて識別子です。(関数名は実際には変数であり,関数文はローカル関数名=関数(パラメータ1など)の略語ですが,関数を使用するためにこの微妙さを理解する必要はありません)。

等は,通常の…の代わりにパラメータ名のパターンを継続するためにここで使用されることに注意してください。これは…それ自体が実際には変数パラメ…タリストを意味するためです。これはここでは説明しません。

関数本体と戻り値

関数と结束文の間の文のブロックは,関数本体です。関数本体では、関数パラメータはローカル変数のように動作し、前述のように、関数呼び出しによって指定された値を持ちます。

返回文は,関数の呼び出し元に返される値を提供します。それはブロックの最後に現れなければなりません(関数内で,もしそうなら,为ループなど;それはそれ自身のブロックにあることができます戻り値…終了)。これは,なし,1,または複数の戻り値を指定することができます。

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

例:

本地函数fsum(a) Local sum = 0 for I = 1, #a do sum = sum + a[I] end返回sum结束本地函数fsum_and_average(a) Local sum = 0 for I = 1, #a do sum = sum + a[I] end返回sum, sum/#a end 

関数呼び出し

関数呼び出しは,関数の本体を実行し,そのパラメ,タの値を指定し,結果を受け取ります。関数呼び出しの構文は、関数名(式 1、式 2 など)で、関数パラメータは対応する式に設定されます。式とパラメータの数は同じである必要はありません。式の数がパラメータよりも少ない場合、残りのパラメータはnilに設定されます。したがって、呼び出しの最後に1つ以上のパラメータをオプションにすることができ、関数がnilでないかどうかをチェックすることによって指定されているかどうかを確認できます。これを行う一般的な方法は、または操作です。

函数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) 

反復子関数と汎用为ル,プ

関数を導入したので,一般的な为ル,プにいて話すことができます。一般的な为ループ(1つの変数を持つ)の構文は次のとおりです。

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

ここでiterator()は,ループ本体の各反復で変数の値を提供するゼロ以上のパラメータを持つ関数です。イテレータ関数は,クロージャと呼ばれるテクニックを使用して,イテレーションのどこにあるかを追跡します。これはここで心配する必要はありません。これは,nilを返すことによって,反復の終了を知らせます。。

イテレータ関数の記述は,本書の範囲を超えていますが,概念を説明する便利な組み込みイテレータがいくつかあります。1つは,テーブル内のエントリを反復処理し,2つの値,キーと次のエントリの値を返すペア()イテレータです。

例:

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,”;")——将所有键值对连接到一个字符串

もう1つの便利なイテレータは,次のCOMBINE_HEADERS()の例で使用されるstring.gmatch()関数です。

関数