Qu'est-ce que cela signifie, dans Lua, d'attribuer un identifiant indéfini à une variable non déclarée?

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

  •  08-10-2019
  •  | 
  •  

Question

Je parcourais un fichier de code Lua, et en haut du fichier contient:

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

La toute première ligne, ils sont en train de faire une mission:

TradeSkillFrameReset = TradeSkillFrame_LoadUI;

A ce point dans le fichier de code sont l'attribution d'un identificateur undeclaraed (de TradeSkillFrame_LoadUI) à une variable non déclarée (de TradeSkillFrameReset). Est-ce permis dans Lua?

  • est déclaration variable implicite?
  • sont tous les identificateurs non déclarés supposés être des déclarations avant?

La chose plus déroutant est que la première TradeSkillFrame_LoadUI semble faire est de se dire:

TradeSkillFrame_LoadUI = function()
   TradeSkillFrameReset();

Comment est-ce pas une boucle infinie?


Edit:. Ajout restant références à TradeSkillFrameReset et TradeSkillFrame_LoadUI

Était-ce utile?

La solution

Si TradeSkillFrame_LoadUI est une fonction globale, les premières captures déclaration cette fonction TradeSkillFrameReset.

Le assigment à TradeSkillFrame_LoadUI remplace alors la fonction globale avec une nouvelle, que dans un premier temps appelle la fonction d'origine à travers la référence TradeSkillFrameReset.

Ce modèle est appelé « crochetage de fonction », est un peu plus d'informations sur la technique générale et certains World of Warcraft environnement Lua détails spécifiques de (où ce script peut provenir, selon le nom de la fonction)

Certains exemples de code, que ce soit clair:

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

OrigFunction = SomeGlobalFunction

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

--...
SomeGlobalFunction()

imprimera la sortie suivante:

  

Je suis la fonction globale d'origine

     

Et voici une modfied ...

Comme une note de côté, le nom de Lua est pas tous capitalisée.

Autres conseils

Sur la première ligne, puisque TradeSkillFrame_LoadUI est une variable non initialisées, cette première ligne:

TradeSkillFrameReset = TradeSkillFrame_LoadUI;

est le même que faire:

TradeSkillFrameReset = nil

La fonction ci-dessous qui ne pénètre pas dans une boucle infinie, car TradeSkillFrameReset n'est pas réellement « pointant vers quoi que ce soit » là.

Je pense que plus tard dans le code, il s'initialisé correctement. Comme ceci:

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

L'astuce est que vous pouvez définir une fonction sur 1, et utiliser la valeur d'une variable sur 3, tout en changeant sur 2.

Permettez-moi de savoir si cela ne suffit pas claire.

À moins que le comportement des variables globales a été modifié dans l'environnement que vous utilisez a été modifié, la déclaration ne fait absolument rien.

local TradeSkillFrameReset = TradeSkillFrame_LoadUI

AURAIT un effet, la création d'une variable locale « créneau horaire » et rendre le code passé ce point utiliser la fente variable locale pour TradeSkillFrameReset plutôt que de faire une recherche de variable globale pour elle. Cependant, comme il est dans le code affiché, il affecte simplement la variable globale à zéro, ce qui a pour effet d'effacer, en d'autres termes, aucun effet si elle était déjà nul.

raisons pour lesquelles il pourrait être là:

1) L'environnement du code est en cours d'exécution en fait quelque chose de spécial quand une affectation de variable globale est fait, plutôt que le comportement par défaut d'une simple affectation. Je ne pense pas que ce soit probable que, comme il y avait un comportement particulier de la recherche de la TradeSkillFrame_LoadUI nulle entraînerait probablement une erreur.

2) La raison la plus probable est tout simplement pour une meilleure lisibilité. Il est à vous faire savoir que TradeSkillFrameReset être correctement affectés à un endroit plus tard enterré dans le code où vous ne le remarquerez pas aussi facilement.

La principale chose à prendre est loin qu'il est facile pour le code Lua pour injecter des variables globales dans tout autre code Lua. Je l'ai utilisé beaucoup de Lua où ils utilisent l'environnement pour ajouter des vars globales. Tout simplement parce que var est pas défini dans ce fichier assurément ne signifie pas qu'il n'existe pas. Il n'a même pas être défini comme une variable globale dans un autre fichier, parce que vous pouvez injectez dans la table d'environnement programme comme si elle était une autre table.

Je suppose que ses quelque chose à faire semblable au levage de la fonction de Javascript, que vous pouvez lire ici: Référencer une valeur JavaScript avant qu'elle ne soit déclarée - quelqu'un peut expliquer cette

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top