2010-03-14 4 views
3

En utilisant Lua, j'essaie d'appeler dynamiquement une fonction avec des paramètres. Je veux envoyer une chaîne à analyser d'une manière qui:Lua: Appel dynamique d'une fonction avec des arguments

  • 1er argument est une instance de classe « poignée »
  • 2 est la fonction à appeler
  • Tout ce qui reste sont des arguments

"modules" est aa table comme { string=<instance of a class> }
split() est un analyseur simple qui retourne une table avec des chaînes indexées.

function Dynamic(msg) 
    local args = split(msg, " ") 
    module = args[1] 
    table.remove(args, 1) 
    if module then 
     module = modules[module] 
     command = args[1] 
     table.remove(args, 1) 
     if command then 
      if not args then 
       module[command]() 
      else 
       module[command](unpack(args)) -- Reference 1 
      end 
     else 
      -- Function doesnt exist 
     end 
    else 
     -- Module doesnt exist 
    end 
end 

Lorsque je tente avec « ignorer supprimer bob », par « Référence 1 », il essaie d'appeler « supprimer » sur l'instance associée à « ignorer » dans les modules, et donne l'argument « bob », contenu dans une table (avec une seule valeur).

Cependant, de l'autre côté de l'appel, la fonction remove ne reçoit pas l'argument. J'ai même essayé de remplacer la ligne "Reference 1" par

module[command]("bob") 

mais j'obtiens le même résultat.

est ici l'autre fonction, qui ne reçoit pas l'argument "bob":

function TIF_Ignore:remove(name) 
    print(name) -- Reference 2 
    TIF_Ignore:rawremove(name) 
    TIF_Ignore:rawremovetmp(name) 
    print(title.. name.. " is not being ignored.") 
end 

I ajouté « Référence 2 » dans mon code quand je tentais de comprendre ce qui était faux. Quand je fais "ignore remove bob", ou quand je remplace le "unpack (args)" par "bob" sur "Reference 1", la variable "name" dans "remove" est toujours nulle.

+0

Votre code semble correct. A quoi ressemble "l'autre côté". –

+0

Et à quoi ressemble la fonction 'split', car elle ne fait pas partie du standard Lua. –

Répondre

3

La déclaration function TIF_Ignore:remove(name) est équivalente à function TIF_Ignore.remove(self, name). Notez l'utilisation de deux points dans le premier cas, il ajoute des paramètres cachés supplémentaires pour émuler OOP et les classes. La façon dont vous appelez la fonction, vous passez "bob" comme le paramètre self au lieu de name.

Pour corriger cela, vous pouvez faire remove "fonction statique" comme ceci: function TIF_Ignore.remove(name). Cependant, vous devrez également modifier rawremove et rawremovetmp d'une manière similaire, à la fois le site de déclaration et d'appel. L'autre option (plus facile) n'est pas de supprimer module du tableau args, il devrait être le premier paramètre passé.

+0

Merci! J'ai choisi cette réponse comme "meilleur" parce que vous avez identifié le problème. Je ne suis pas expérimenté dans Lua et je veux juste "faire fonctionner cette chose", et vous l'avez fait arriver! Merci! – Tipx

3

Si vous souhaitez appeler une fonction définie avec la syntaxe deux-points :, vous devez lui transmettre un argument supplémentaire, à savoir la table attendue. Parce que l'exemple particulier que vous donnez ne pas utiliser self, vous pouvez passer à la syntaxe point ., mais si vous avez besoin de la généralité, regardez le code ci-dessous:

function Dynamic(msg) 
    local args = split(msg, " ") 
    local module = table.remove(args, 1) 
    if module and modules[module] then 
     module = modules[module] 
     local command = table.remove(args, 1) 
     if command then 
      local command = module[command] 
      command(module, unpack(args)) 
     else 
      -- Function doesnt exist 
     end 
    else 
     -- Module doesnt exist 
    end 
end 

J'ai également fixé un certain nombre de mineurs problèmes:

  • Les variables doivent être local.
  • args est toujours non-nul.
  • La recherche modules[module] peut échouer.
  • table.remove renvoie l'élément supprimé et il est possible de l'appeler sur une table vide.
+0

Merci, votre réponse m'a aidé à pointer un bon nombre d'autres problèmes dont je n'étais pas au courant, et que je devais corriger !! – Tipx

Questions connexes