1

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

function doSomething()
    print('x')
end

我希望 LuaFunction 指向doSomething.

我能够使用正则表达式来捕获函数的名称,然后使用 NLua.Lua.GetFunction 但这不适用于函数中的函数。

现在我的代码使用 KeraLua.Lua.LoadString 并为 LoadString 创建的块返回一个 LuaFunction。这种工作,但这意味着 LuaFunction 不能接受 args。

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

4

1 回答 1

0

你必须使用DoString而不是LoadString. LoadString不执行它只是编译它以便稍后运行的代码,因此它没有在状态中定义函数。必须定义函数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-11T14:27:57.943 回答