Luaのイテレータ
イテレータ(反復子が)標準テンプレートライブラリのコンテナの一部またはすべての要素を横断するために使用できるオブジェクトで、各イテレータオブジェクトのアドレスが決定された容器を表し、
Luaのイテレータでは、コレクションの各要素を横断することができる、支持構造体のポインタ型です。
イテレータのためのジェネリック
反復機能、状態定数、制御変数:独自の内部反復機能の保全のためのジェネリック医薬品は、実際には、それは3つの値が保存されます。
反復のためのジェネリック医薬品は、キー/値のペアのセットを提供し、次のように、構文は次のとおりです。
for k, v in pairs(t) do print(k, v) end
ペア(t)は式のリストのために、上記のコードは、kは、変数リストをV。
次の例を参照してください:
array = {"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end
出力は、上記のコードが実行されます。
1 Lua 2 Tutorial
上記の例では、我々は、Luaはデフォルトで提供反復関数ipairsを使用しました。
ここでは、ファンを実行するためのプロセスを見てみましょう。
- 式が3未満を返す場合、マルチ値の割り当て、結果の数、反復機能、状態定数、制御変数:まず、式後の値で計算し、初期化し、式は、3つの値の必要な範囲のために返す必要がありますゼロポイントは自動的に占めるようになると、余分な部分は無視されます。
- 第二に、状態定数とイテレータ機能(注:構造のため、状態定数を無用、反復関数に初期化され、渡されたときにちょうど彼の値を取得)を呼び出すためのパラメータとして変数を制御します。
- 第三に、この関数は変数リストに値の反復を返します。
- 第四に、もしループの第一の端部におけるゼロの戻り値、それ以外の場合はループ本体。
- 第五に、バック第二段階の反復関数の呼び出しは、再び
。 Luaのでは、多くの場合、イテレータ関数を記述するために使用し、この関数を呼び出すたびに、コレクションの次の要素を返します。 Luaのイテレータは、次の2つのタイプが含まれています。
- ステートレスイテレータ
- マルチ状態イテレータ
ステートレスイテレータ
ステートレスイテレータは、どのような状態のイテレータを保持していないので、私たちは余分な価格を過ごすクロージャを作成するループステートレスイテレータの回避を使用することができ指します。
各繰り返し、繰り返し関数はパラメータは次の要素を取得するためにのみこれらの2つの値を使用してステートレスイテレータと呼ばれているように、2つの変数(状態や制御変数定数)の値です。
このような単純なステートレスイテレータの典型的な例は、配列の各要素を通じてipairs、彼です。
私たちは、イテレータを達成するために簡単な関数を使用する次の例では、デジタルnが乗:
function square(iteratorMaxCount,currentNumber) if currentNumber<iteratorMaxCount then currentNumber = currentNumber+1 return currentNumber, currentNumber*currentNumber end end for i,n in square,3,0 do print(i,n) end
上の例の出力は、次のとおりです。
1 1 2 4 3 9
反復トラバーサル状態は(サイクルは一定の状態を変更しない時に)テーブルと現在のインデックスインデックス(制御変数)、ipairsを含み反復機能は、我々はLuaの中で達成することができ、非常に簡単です:
function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs (a) return iter, a, 0 end
Luaは(a)のサイクルを開始するipairsを呼び出すと、彼は3値取得:反復関数iterの、一定の状態、0の制御変数の初期値を、次にLuaは、[1](しない限り、1を返します(0)ITERを呼び出します[1] = nilの); 2回目の反復は、ITERを呼び出す(1)最初のゼロ要素まで[2] ......、2を返します。
マルチ状態イテレータ
多くの場合、必要性は、単に制御定数と変数を述べるのではなく、イテレータの状態情報を複数保持するために、最も簡単な方法は反復としてテーブルにすべての状態情報、テーブルをカプセル化する方法があるが、クロージャを使用することですこの場合、すべての情報はテーブルに格納することができるので、定数の状況は、そう反復関数は、通常、二番目のパラメータは必要ありません。
次の例では、我々は我々自身のイテレータを作成しました:
array = {"Lua", "Tutorial"} function elementIterator (collection) local index = 0 local count = #collection -- 闭包函数 return function () index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end for element in elementIterator(array) do print(element) end
上の例の出力は、次のとおりです。
Lua Tutorial
上記の例では、我々は、各要素の設定サイズと出力を達成するために計算てElementIterator関数内でクロージャの使用を、見ることができます。