2016-06-27 9 views
1

Wenn ich die Argumentposition in function iter2(max,key) zu iter2(key,max) vertausche und dasselbe wie iter,1,8 aufrufe, entsteht eine Endlosschleife.Lua Iteratoren: Die Position des Austauscharguments führt zu einer Endlosschleife

function iter2(max,key) 
    if key == nil then 
     return 2 , "value:" .. 2 
    end 
    if key >= max then 
     return nil 
    else 
     return key+2, "value:" .. key+2 
    end 

end 

for k,v in iter2,8,1 do 
    print(k,v) 
end 

Was ist der Grund für dieses Verhalten?

Antwort

1

Vom Lua PiL chapter auf das Verhalten von for -Aussage.

for <var-list> in <exp-list> do 
    <body> 
end 

Das erste, was die for tut, ist die Ausdrücke nach die in bewerten Diese Ausdrücke in den drei Werten gehalten führen sollte die for: die Iterator Funktion, die invariant Zustand und der Anfangswert für die Steuervariable. [...]

Nach dieser Initialisierung Schritt ruft die for die Iterator Funktion mit zwei Argumenten: der unveränderliche Zustand und die Regelgröße. (Beachten Sie, dass für die for Struktur, die invariant Staat hat keine Bedeutung überhaupt nicht. Es wird nur diesen Wert aus dem Initialisierungsschritt und es passiert, wenn es die Iterator-Funktion aufruft.) Dann wird die for ordnet die zurückgegebenen Werte von die Iterator-Funktion zu Variablen , die von ihrer Variablenliste deklariert werden. Wenn der erste zurückgegebene Wert (der , der der Steuervariablen zugewiesen ist) nil ist, wird die Schleife beendet. Andernfalls führt der for seinen Rumpf aus und ruft die Iteration erneut auf, um den Vorgang zu wiederholen.

Deshalb, wenn Sie die Variablen in der Definition der Funktion sind Schalten Sie verwenden tatsächlich den Wert Ihrer Regelgröße als die unveränderliche Zustand.