3

これが基本的な for ループです

local a = {"first","second","third","fourth"}
for i=1,#a do 
    print(i.."th iteration")
    a = {"first"}
end 

現在のように、ループは 4 回の反復すべてを実行します。

外出先で for-loop-limit を計算するべきではありませんか? 動的に計算すると、最初の反復の最後で #a が 1 になり、for ループが壊れます。

確かにそれはより理にかなっているでしょうか?それとも、そうではない理由について何か特別な理由がありますか?

4

3 に答える 3

7

数値ループの制限が 1 回だけ計算される主な理由forは、パフォーマンスのためです。

for現在の動作では、関数呼び出しを含め、パフォーマンスを犠牲にすることなく、任意の複雑な式をループ制限に配置できます。例えば:

local prod = 1
for i = computeStartLoop(), computeEndLoop(), computeStep() do
  prod = prod * i
end

上記のコードは、各反復で呼び出す必要がある場合computeEndLoop、非常に遅くなります。computeStep

標準の Lua インタープリター、特に LuaJIT が他のスクリプト言語に比べて非常に高速であるとすれば、それは多くの Lua 機能がパフォーマンスを考慮して設計されているためです。


単一の評価動作が望ましくないまれなケースでは、orforを使用してループを汎用ループに簡単に置き換えることができます。while endrepeat until

local prod = 1
local i = computeStartLoop()
while i <= computeEndLoop() do
  prod = prod * i
  i = i + computeStep()
end
于 2012-11-04T06:28:49.717 に答える
1

長さは、for ループが初期化されるときに 1 回計算されます。ループのたびに再計算されるわけではありません。for ループは、開始値から終了値まで反復するためのものです。配列が再割り当てされた場合に「ループ」を早期に終了させたい場合は、独自のループ コードを記述できます。

local a = {"first", "second", "third", "fourth"}                                                                           

function process_array (fn)                                                                                                
   local inner_fn                                                                                                          
   inner_fn =                                                                                                              
      function (ii)                                                                                                        
         if ii <= #a then                                                                                                  
            fn(ii,a)                                                                                                       
            inner_fn(1 + ii)                                                                                               
         end                                                                                                               
      end                                                                                                                  
   inner_fn(1, a)                                                                                                          
end                                                                                                                        


process_array(function (ii)                                                                                                
                    print(ii.."th iteration: "..a[ii])                                                                     
                    a = {"first"}                                                                                          
                     end) 
于 2012-11-04T00:54:41.327 に答える
0

パフォーマンスは良い答えですが、コードが理解しやすくなり、エラーが発生しにくくなると思います。また、そうすることで、for ループが常に終了することを (ほぼ) 確実にすることができます。

代わりにそれを書いたらどうなるか考えてみてください:

local a = {"first","second","third","fourth"}
for i=1,#a do 
    print(i.."th iteration")
    if i > 1 then a = {"first"} end
end

どのように理解していますfor i=1,#aか?等値比較( で止まるi==#a)か、不等比較( で止まるi>=#a)か。それぞれの場合、どのような結果になるでしょうか。

forPython の慣用句 using のように、Lua ループはシーケンスの反復として表示されるはずです(x)range

a = ["first", "second", "third", "fourth"]
for i in range(1,len(a)+1):
    print(str(i) + "th iteration")
    a = ["first"]

を使用するたびに条件を評価したい場合while

local a = {"first","second","third","fourth"}
local i = 1
while i <= #a do 
    print(i.."th iteration")
    a = {"first"}
    i = i + 1
end
于 2012-11-05T17:21:16.467 に答える