毎日1 Lua(5)-反復器と汎用for

2341 ワード

反復器とは、1つの集合内のすべての要素を遍歴できるメカニズムです.luaでは、反復器は通常関数として表され、順次関数を呼び出すたびにセット内の次の要素が返されます.
1.最も簡単な反復器
まずc++の反復器を見てvectorのすべての要素を出力します.
#include  #include  using namespace std; int main() {     vector ivec(5,-1);     for (vector::iterator iter = ivec.begin(); iter!= ivec.end(); ++iter)        cout< 
  
lua 。
--declare an iterator function values(t) 	local i=0; 	return function() i=i+1;return t[i] end end t={-1,-1,-1,-1,-1}  --create iterator iter=values(t) while true do 	local element=iter() 	if element==nil then break end 	print(element) end 

プログラムで された は したclosureである.
このclosureは 、closure とclosureを するファクトリ(factory) の2つの に されます.
forで するのはもっと です.それはそれのために きているからです.
--for style for element in values(t) do print(element) end

は じです.
2. for
に を する は ずclosureを し、 forは ありません. には、 forには3つの が されています.1つの 、1つの 、1つの です.
これまでの forの を てみましょう.
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} for k,v in pairs(days) do print(k..":"..v) end

、 forの は のとおりです.
for  in  do        end

1つ の のリストで、カンマで られています.は、 じカンマで られた1つ の のリストです. 、 のリストには、 ファクトリへの び しという が1つしかありません.
リストの の を「 」と び、nilの ループが します.
forの のことはinの の を することです.これらの はfor のために3つの を すべきです. 、 、 の です.これは、 の の り てに ています.
3.
が を しない を す.
この のたびに、forループは の と で を び し、 の はこの2つの に づいて の のために の を することができます.
ipairsはこのような です.
a={"one","two","three"} b={[2]="four",[3]="five",[4]="six"}  for i,v in ipairs(a) do 	print(i,v) end  for i,v in ipairs(b) do 	print(i,v) end

その 、aのみが され、bは されなかった.
ここで する は、 するtableと のインデックス です.
luaはforループのipairs(a)を び すと、3つの : iter、 a、 の 0が られ、その iter(a,0)が び され、1,a[1]が られ、2 の でiter(a,1)が び され け、
2,a[2]を ,これを した.
bを る 、key=1のときvalueはnilであるため、 ループを び して を しない.