Zitat Chromix:
Lokaler Wert eines äußeren Blocks
Wenn ich es richtig verstanden habe etwa so:
function xyz() -- Block beginnt local zxy = 0; if 1 == 1 then -- innerer Block beginnt zxy = 1; -- xyz ist ein Upvalue, da es im äußeren Block als local delariert wurde. end -- innerer Block endet end -- äußerer Block endet
Die Variable ist zwar nicht global, aber in höheren Blöcken erzeugt und so weiter sichtbar; deswegen UP (hoch/höher).
Sehr gute Erklärung von Old McDonald:
Also, das sind zwar Upvalues, aber normalerweise ist das einem vollkommen egal und sie werden im Lua-Bytecode auch nicht mehr als Upvalues gespeichert, sondern als normale lokale Variablen, da normale Blöcke nicht außerhalb der Funktion gelangen können. Sie sind nur für den Parser selbst wichtig. Interessante, im Bytecode selbst gespeicherte Upvalues sind diese hier:
function func1() --Gültigkeitsbereich der Funktion func1() --die Funktionen func2() und func3() können auf die lokalen Variablen zugreifen und auch gegenseitig und für func1() ändern local x = 1; local func2 = function() return x; end local func3 = function() x = x + 1; end print(func2()); -- 1 func3(); print(func2()); -- 2 --hier wird der Gültigkeitsbereich der Funktion func1() verlassen --dadurch werden die Upvalues "geschlossen", jede Funktion besitzt sie nur noch für sich und kann sie nur noch für sich ändern return func2, func3; end local func2, func3 = func1(); func3(); print(func2()); -- 2
Sobald der Gültigkeitsbereich verlassen wurde und die Funktionen global gespeichert werden, entstehen (meist) die Speicherprobleme in Siedler 5. Das gilt aber nicht für Briefings, denn die Finished-Funktion wird sofort nach dem Ende des Briefings aufgerufen, der Spieler hat keine Chance, abzuspeichern.