Was bedeutet es, in Lua, eine nicht definierte Kennung zu einer nicht deklarierten Variablen zuweisen?

StackOverflow https://stackoverflow.com/questions/3949534

  •  08-10-2019
  •  | 
  •  

Frage

Ich war eine Lua-Code-Datei durchlesen, und die Spitze der Datei enthält:

    1  | TradeSkillFrameReset = TradeSkillFrame_LoadUI;
    2  | 
    3  | TradeSkillFrame_LoadUI = function()
    4  |    TradeSkillFrameReset();
            ...
    112|    TradeSkillFrame_LoadUI = TradeSkillFrameReset;
            ...
    114| end;

Die erste Zeile sie einen Auftrag tun:

TradeSkillFrameReset = TradeSkillFrame_LoadUI;

An diesem Punkt in der Codedatei sie die Zuweisung eine undeclaraed Kennung (TradeSkillFrame_LoadUI) zu einem nicht deklariert Variablen (TradeSkillFrameReset). Ist das in Lua erlaubt?

  • ist Variablendeklaration implizit?
  • sind alle nicht deklarierten Bezeichner Vorwärts-Erklärungen angenommen?

Je mehr verwirrend ist, dass der erste TradeSkillFrame_LoadUI zu tun scheint selbst zu nennen:

TradeSkillFrame_LoadUI = function()
   TradeSkillFrameReset();

Wie ist das nicht eine unendliche Schleife?


Edit:. Hinzugefügt verbleibenden Verweise auf TradeSkillFrameReset und TradeSkillFrame_LoadUI

War es hilfreich?

Lösung

Wenn TradeSkillFrame_LoadUI ist eine globale Funktion, die erste Anweisung erfaßt diese Funktion in TradeSkillFrameReset.

Die assigment zu TradeSkillFrame_LoadUI ersetzt dann die globale Funktion durch eine neue, die auf den ersten Anrufe die ursprüngliche Funktion durch die TradeSkillFrameReset Referenz.

Dieses Muster „Funktion Einhaken“ genannt, hier ist einige weitere Informationen über die allgemeine Technik und einige World of Warcraft Lua umgebungsspezifischen Details (wo dieses Skript aus kommen kann, nach dem Namen der Funktion)

Einige Beispiel-Code, dies deutlich zu machen:

function SomeGlobalFunction()
    print("I'm the original global function")
end

OrigFunction = SomeGlobalFunction

SomeGlobalFunction = function()
    OrigFunction()
    print("And here's the modfied one...")
end

--...
SomeGlobalFunction()

Dies wird die folgende Ausgabe drucken:

Ich bin die ursprüngliche globale Funktion

Und hier ist die modfied eines ...

Als Randbemerkung, Lua Name ist nicht alle aktivierten .

Andere Tipps

In der ersten Zeile, da TradeSkillFrame_LoadUI ist ein nicht initialisierte Variable, dann ist diese erste Zeile:

TradeSkillFrameReset = TradeSkillFrame_LoadUI;

Ist das gleiche wie zu machen:

TradeSkillFrameReset = nil

Die Funktion unter dem nicht eine Endlosschleife eingeben, da TradeSkillFrameReset nicht wirklich ist ‚deutete auf etwas‘ da.

Meine Vermutung ist, dass später im Code, es richtig initialisiert wird. Wie so:

TradeSkillFrameReset = TradeSkillFrame_LoadUI;

TradeSkillFrame_LoadUI = function()  -- 1. function declaration
   TradeSkillFrameReset();

   [...snip...]
end;

[... snip ...]
TradeSkillFrameReset = somethingElse -- 2. initialized to something else
TradeSkillFrame_LoadUI()             -- 3. function invocation

Der Trick ist, dass Sie eine Funktion auf 1 definieren, und verwenden Sie den Wert einer Variablen auf 3, während es auf 2 zu ändern.

Lassen Sie mich wissen, wenn dies nicht klar genug ist.

Es sei denn, das Verhalten von globalen Variablen ist in der Umgebung modifiziert worden, dass Sie verwenden geändert wurde, die Aussage absolut nichts.

local TradeSkillFrameReset = TradeSkillFrame_LoadUI

hätte einen Effekt haben, eine lokale Variable „Schlitz“ und machen Code über diesen Punkt Verwendung für TradeSkillFrameReset die lokale Variable Slot zu schaffen, anstatt eine globale Variable Lookup, es zu tun. Doch wie es Sie in den Code geschrieben ist, einfach die globale Variable auf Null zuweist, die die Wirkung des Löschens hat, mit anderen Worten, keine Wirkung, wenn es schon gleich Null.

Gründe könnte es da sein:

1) Die Umgebung der Code in läuft tut etwas Besonderes, wenn eine globale Variablenzuweisung erfolgt, anstatt das Standardverhalten einer einfachen Zuordnung. Ich glaube nicht, das wahrscheinlich ist jedoch, als ob es eine spezielle Verhalten würde die Suche nach dem nil TradeSkillFrame_LoadUI war vermutlich Ursache eines Fehlers.

2) Der wahrscheinlichste Grund ist einfach für die Lesbarkeit. Es ist, damit Sie wissen, dass TradeSkillFrameReset wird richtig im Code später begraben irgendwo zugeordnet werden, wo man es nicht so leicht auffallen wird.

Die Hauptsache weg zu nehmen ist, dass es einfach für Lua Code globale Variablen in anderen Lua Code zu injizieren. Ich habe eine Menge von Lua verwendet, wo sie die Umwelt verwenden globale Variablen hinzuzufügen. Nur weil ein var nicht in dieser Datei ganz gewiss bedeutet jedoch nicht definiert ist, dass es nicht existiert. Es ist nicht einmal als globale Variable in einer anderen Datei definiert werden müssen, weil Sie in die Umwelt Tabelle injizieren kann programmatisch, als ob es eine andere Tabelle waren.

würde ich seine etwas zu tun, ähnlich wie Javascript-Funktion der Hebe erraten, was Sie hier lesen: einen JavaScript-Wert referenzieren, bevor sie deklariert ist - kann jemand diese

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top