Lua内容forループについてのまとめ(二)


転載は出典を明記すればよいので,本人の同意を得る必要はない.本文の内容はネット上の内容の総括と本人の総括で、もし権利侵害が存在するならば、私に本人が文章を削除することを教えてください.
本文を読む前に、「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

は、カンマで区切られた1つ以上の変数名のリストです.は、1つ以上の式のリストであり、カンマで区切られています.通常、式のリストには、反復関数の呼び出しという要素が1つしかありません.例:
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=の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関数は一定状態と制御変数の初期値を返しますが、どのような場合ですか?
    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のパラメータとなる.これで、説明がはっきりした.