Benutzer-Werkzeuge

Webseiten-Werkzeuge


glossary:upvalues

Upvalues

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.

glossary/upvalues.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)