Lua内容forループについてのまとめ(二)
10442 ワード
転載は出典を明記すればよいので,本人の同意を得る必要はない.本文の内容はネット上の内容の総括と本人の総括で、もし権利侵害が存在するならば、私に本人が文章を削除することを教えてください.
本文を読む前に、「Lua内容forループに関するまとめ(一)」を読むともっと役に立つかもしれません.
上記の説明の後,for遍歴を用いた4つの基本的な方法を知った.しかし、これはまだすべてではありません.私たちが理解しなければならない内容もあります.
次の例を見て、理解していますか.
上の例が読めない場合は、下を見てください.
まず私たちが議論しなければならないのはfor...in...の意味、すなわちfor...in...がいったいどんな仕事をしたのかということです.
for..inの意味
汎用forの構文は次のとおりです.
は、カンマで区切られた1つ以上の変数名のリストです.は、1つ以上の式のリストであり、カンマで区切られています.通常、式のリストには、反復関数の呼び出しという要素が1つしかありません.例:
forの最初のことはinの後の式を評価することです.これらの式はfor保存のために3つの値を返すべきです.反復器関数、一定状態、制御変数の初期値です.ここでは多重付与値と同様に、最後の式だけが複数の結果を生成し、最初の3つの値しか保持されず、余分な値は破棄されます.足りなければnilで補う.次の閉包関数は反復関数のみを返し、一定の状態と制御変数は返されません.
次に、inの後の式は3つの値を返します.次に、コードで説明します.例えば、
上のコードは、次のコードに等価です.
for inの正体の最初のコードを見てみましょう:local_f, _s, _var=の3つの戻り値は、反復関数(_f)、一定状態(_s)、制御変数の初期値(_var)を表します.
反復器関数:説明する必要はありません.私たちの閉パッケージ関数が返す関数です.一定状態:実は変数で、この変数はずっと変わらないので、一定と呼ばれています.変数の初期値を制御します:一定に対して、これは絶えず変化する変数です.例えばリストのようにiter関数は、戻り値が1つしかないので、その閉じた関数です.sと_varはnilです. は次にlocal kを呼び出し、v=f(_s, _var); これは実際には閉じた関数を呼び出し、一定値と変数値をパラメータとして渡します. Luaの関数は自由です.f関数自体にはパラメータがなく、パラメータを転送することもでき、何の影響もありません.だから、2つのnil値が転送され、何も起こりません.直接呼び出しのようです.f()と同じです. 次のコード:var = k; これは、閉関数(_f)を呼び出すたびに次の反復値が返されるので、閉関数(_f)の最初の戻り値を保存します.varは毎回異なる値です.ここで注意しなければならないのは_varの値は閉じた関数の最初の戻り値に等しく、閉じた関数がv値だけを返す場合、_var=v;閉じた関数が2つの値を返し、最初の値がkの場合_var=k.ここでは説明のためだけです.varの値はkに等しいとは限らない. もし_varの値がnilの場合、ループを停止し、反復を終了します.したがって,反復器を記述するとき,反復が終了する方法は,最初の戻り値をnilにすることである.
ではlist_iter関数は一定状態と制御変数の初期値を返しますが、どのような場合ですか?
一定値は自然に常に変化しますが、変数値は閉じた関数が呼び出されるたびにkの値が付与されるので、変数値はtableのkey値で変化します(ここでの変数値はtableのkey値で変化し、上記の例についてです.閉じた関数が返す最初の値はkeyです).
ブログの参考内容:http://blog.csdn.net/musicvs/article/details/40351197
最初の質問に戻ります.その動作原理を理解していますか.
実は上の内容は無状態の反復器と関係があり、自分で関連内容を探すことができますが、ここではあまり説明しません.
上の大きな説明を経て、上の例のinの後ろに私たちが求める式があると思うかもしれませんが、squareのパラメータはどこですか?また、squareは式の前に置かれているので、squareは1つの値しか返されません.これは私たちが必要としないことは明らかです.
理由を説明します.上のsquareは、私たちが求める式ではなく、式が返す反復関数です.次の2つの値は、私たちが求めた式が返す一定の状態と制御変数です.
前述のfor...in...では、一定状態および制御変数が反復器関数に入力される必要があるため、上のinの後の2つの値がsquareのパラメータとなる.これで、説明がはっきりした.
本文を読む前に、「Lua内容forループに関するまとめ(一)」を読むともっと役に立つかもしれません.
上記の説明の後,for遍歴を用いた4つの基本的な方法を知った.しかし、これはまだすべてではありません.私たちが理解しなければならない内容もあります.
次の例を見て、理解していますか.
function square(iteratorMaxCount,currentNumber)
if currentNumberthen
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0 do
print(i,n)
end
上の例が読めない場合は、下を見てください.
まず私たちが議論しなければならないのはfor...in...の意味、すなわちfor...in...がいったいどんな仕事をしたのかということです.
for..inの意味
汎用forの構文は次のとおりです.
for in <exp-list> do
end
for k, v in pairs(t) do
print(k, v)
end
forの最初のことはinの後の式を評価することです.これらの式はfor保存のために3つの値を返すべきです.反復器関数、一定状態、制御変数の初期値です.ここでは多重付与値と同様に、最後の式だけが複数の結果を生成し、最初の3つの値しか保持されず、余分な値は破棄されます.足りなければnilで補う.次の閉包関数は反復関数のみを返し、一定の状態と制御変数は返されません.
```
function list_iter(tab)
local i=0
return function()
i=i+1
return tab[i]
end
end
tab={12,233,1221,231}
for k in list_iter(tab) do
print(k)
end
-----------------------------------------------------
:
?( )
- , 。
- ,** ** 。
```
function doA()
return 11,22
end
-- ,doA() ,
--a,b,c 11,2,nil。
--a,b,c=doA(),2
a,b,c=2,doA()
print(a,b,c)
-----------------------------------------------------
次に、inの後の式は3つの値を返します.次に、コードで説明します.例えば、
for k,v in do
end
上のコードは、次のコードに等価です.
do
-- 、
local _f, _s, _var =
while true do
local k, v = _f(_s, _var)
-- _var。
_var = k
if _var == nil then
break
end
print(k .. "," .. v)
end
end
-- , :
do
local _f =
while true do
local k, v = _f()
if k == nil then
break
end
print(k .. "," .. v)
end
end
for inの正体の最初のコードを見てみましょう:local_f, _s, _var=
反復器関数:説明する必要はありません.私たちの閉パッケージ関数が返す関数です.一定状態:実は変数で、この変数はずっと変わらないので、一定と呼ばれています.変数の初期値を制御します:一定に対して、これは絶えず変化する変数です.
ではlist_iter関数は一定状態と制御変数の初期値を返しますが、どのような場合ですか?
function list_iter(tab)
local i=0
-- i, var=i
return function(s,var)
i=i+1
if tab[i]==nil then
return nil
end
print(" "..s," "..var)
return i,tab[i]
end,10,0 -- 。
end
t={"aaaa","aaa","aa"}
for k,v in list_iter(t) do
print(k,v)
end
--
-- 10 0
-- 1 aaaa
-- 10 1
-- 2 aaa
-- 10 2
-- 3 aa
一定値は自然に常に変化しますが、変数値は閉じた関数が呼び出されるたびにkの値が付与されるので、変数値はtableのkey値で変化します(ここでの変数値はtableのkey値で変化し、上記の例についてです.閉じた関数が返す最初の値はkeyです).
ブログの参考内容:http://blog.csdn.net/musicvs/article/details/40351197
最初の質問に戻ります.その動作原理を理解していますか.
function square(iteratorMaxCount,currentNumber)
if currentNumberthen
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0 do
print(i,n)
end
実は上の内容は無状態の反復器と関係があり、自分で関連内容を探すことができますが、ここではあまり説明しません.
上の大きな説明を経て、上の例のinの後ろに私たちが求める式があると思うかもしれませんが、squareのパラメータはどこですか?また、squareは式の前に置かれているので、squareは1つの値しか返されません.これは私たちが必要としないことは明らかです.
理由を説明します.上のsquareは、私たちが求める式ではなく、式が返す反復関数です.次の2つの値は、私たちが求めた式が返す一定の状態と制御変数です.
前述のfor...in...では、一定状態および制御変数が反復器関数に入力される必要があるため、上のinの後の2つの値がsquareのパラメータとなる.これで、説明がはっきりした.