LUA関数クロージャ

言葉はスコープ:別の関数は、関数内で入れ子になったときに、関数が外部関数のローカル変数にアクセスすることができ、そのような特徴語は、スコーピングと呼ばれています

    table.sort(名前、functin(N1、N2)
        の戻りグレード[N1]>グレード[N2] 
    エンド)
    //無名関数は、外部関数のN1、N2の内部にアクセスすることができます

ファーストクラス値:LUA関数値であり、彼は戻り値として、パラメータの関数として、変数を提示することができます

コードをコピー
    テスト機能は、()
        ローカルI = 0 
        return関数()
            I ++は
            ... 
        エンド
    エンド
    も、私はローカル変数の外にはどこと呼ばれ、関数として//戻り値Luaの上位値であります
コードをコピー

 

クロージャ:外部関数外部関数によって保持された内部プラス外部のローカル変数(上位値)の関数(すなわち、植物である)を含む関数のインスタンスを呼び出すことによって生成されます

閉鎖組成:作成上位値+内部+外部関数関数外部関数(クロージャ機能)

例:

コードをコピー
    テスト機能()
        ローカルI = 0 
        復帰機能()// tailcall 
            I + = 1つの
            戻りI 
        端は
    エンド
    C1 =テスト()
    C2 =試験()// C1、C2は同じ機能に内蔵された、同じローカル変数異なるクロージャの上記2つの異なるインスタンス
            独立上位値の//閉鎖、コールテスト()新しい閉鎖生産する
    プリント(C1()) - > 1つの
    印刷(C1を()) - - >各呼び出し繰り返し呼び出しが2 //呼び出しの最後の値を覚え、その= 1 iが有している
    ので、> 1つの//異なるクロージャ異なる上位値-プリント(C2())     
    プリント(C2を( )) - > 2
コードをコピー

 

イテレータでのクロージャの使用:反復子が最後にコールし、成功した状態のコールを保持する必要がある、ちょうど閉鎖機構を使用して実装することができます

イテレータだけビルダーに注意を払う必要がありますイテレータを作成し、そして:(彼自身循環なし)

コードをコピー
     list_iter関数(T)
            ローカルI = 0 
            ローカル= N-table.getn(T)
            リターン機能()
                I = Iが+ 1 
                Iに<= N-戻り、次いでT [I] END IF 
            エンド
        エンド
    list_iter //ここ植物です、内側閉鎖の新しいクロージャを生成する各呼び出しは上位値(T、I、N-)を含む
    ように生成されたクロージャ一旦クロージャの各関数コールが記録の状態に基づいてされるように//、及び次の一覧に戻ります
コードをコピー

イテレータを使用します:

Ctrl + Cを押してコードをコピーします

おすすめ

転載: www.cnblogs.com/delphixe/p/11324830.html