如何在不知道Lua函数的名称的情况下创建一个NLua.LuaFunction?

我试图创建一个方法,这个方法评估一个字符串并返回一个包含在其中的函数的LuaFunction对象。这些字符串将由用户输入,因此我无法事先知道函数的名称。示例字符串:

function doSomething()
    print('x')
end

我希望LuaFunction指向doSomething

我能够使用正则表达式捕获函数名称,然后使用NLua.Lua.GetFunction,但在函数中使用函数时,该方法无效。

现在,我的代码使用KeraLua.Lua.LoadString并返回一个由LoadString创建的块的LuaFunction。这有点有效,但这意味着LuaFunction不能接受参数。

这个答案与我想要的类似,但我无法像它所示的那样强制函数成为表的成员。

点赞
用户7396148
用户7396148

你必须使用 DoString 而不是 LoadStringLoadString 只是将代码编译以便后续运行,所以它不会将函数定义在状态中。函数必须在 GetFunction 或索引中定义才能工作。

如果输入的字符串只是函数定义,则可以执行以下操作之一:

Lua state = new Lua();
state.DoString((string)s); //define function in state by executing the input.

LuaFunction f1 = state.GetFunction("doSomething");
f1.Call("f1");

LuaFunction f2 = (LuaFunction)state["doSomething"];
f2.Call("f2");

用户输入示例:

function doSomething(s)
    print(s)
end

此解决方案不包括本地函数或存储在表中的函数。

2020-08-11 14:27:57