2 votes

Appel d'une fonction Lua par un nom de chaîne

Ce que j'essaie de faire :

someTable={
    function Add(a,b)
        return a+b
    end

    function Mult(a,b)
        return a*b
    end

    function CallFunc(name,inputs)
 funcByName(table.unpack(inputs))
    end
}

Et ensuite je peux l'appeler depuis C# :

void Call(string name, params object[] inputs)

Et la question est : comment appeler une fonction par le nom d'une chaîne de caractères ?

De même, CallFunc sera dans metatable.

S'il existe un autre moyen de résoudre le problème, j'aimerais le savoir.

(Désolé pour le formatage mais j'écris depuis un téléphone pour une raison quelconque)

Edit : C'était stupide de ma part de poser la question. Ce que j'essayais de faire est d'accéder à une "fonction membre" par son nom. Ce n'est pas vraiment comme ça que fonctionne Lua. Donc la réponse est simple :

function CallFunc(self, name, ...)
    self[name](...)
end

Et en C# :

void CallLuaFunc(LuaTable tb,string name,params object[] inputs){
    //call lua from c#
}

Ainsi, le programme principal c# ne doit être compilé qu'une seule fois puisqu'il peut appeler n'importe quelle fonction lua par son nom.

(BTW la bibliothèque est XLua, une bibliothèque lua pour Unity3D pour permettre le hotfix)

1voto

Ivo Beckers Points 1023

Toutes les variables et fonctions globales sont stockées dans la table globale nommée _G Cela vous permet d'accéder à une fonction par son nom de chaîne. Le code suivant imprime "test" trois fois. Remarquez que la troisième fois utilise une chaîne de caractères pour y accéder

function a()
  print("test")
end

a()
_G.a()
_G["a"]()

1voto

Robert Points 1300

Je suggère de placer la bibliothèque dans son propre fichier Lua.

-- my-lib.lua

local Module = {}

function Module.Add(a,b)
  return a+b
end

function Module.Mult(a,b)
  return a*b
end

function Module.GenericCall(FunctionName,...)
  local Function = Module[FunctionName]
  if Function then
    return Function(...)
  end
end

return Module

Ensuite, l'utilisation de cette bibliothèque dans une autre partie du code Lua est simple :

local MyModule    = require("my-lib")
local GenericCall = MyModule.GenericCall

GenericCall("Add",  1, 2)
GenericCall("Mult", 1, 2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X