【问题标题】:Can I create an NLua.LuaFunction without the name of the Lua function?我可以创建一个没有 Lua 函数名称的 NLua.LuaFunction 吗?
【发布时间】:2020-12-01 04:07:35
【问题描述】:

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

function doSomething()
    print('x')
end

我希望 LuaFunction 指向 doSomething

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

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

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

【问题讨论】:

  • 我不相信您可以在不通过表访问的情况下访问其他匿名函数。你能接受sometable.thefucntion 作为输入吗?使用正确的输入,您可以使用该输入来获取功能。
  • 它们不是匿名函数,我只是不知道名字。
  • sorry可能误解了问题,你是不是要获取用户刚才写的函数名,输入的是整个函数?
  • 是的,好吧,我的意思是我需要得到没有标识符名称的函数
  • 是否强制执行函数定义格式?你可以定义它doSomething = function()... 有或没有一个过程local,你也可以在一个表甚至全局定义它_G['doSomething'] = function()... 这些在解决方案的范围内吗?

标签: c# lua nlua


【解决方案1】:

您必须使用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

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

【讨论】:

  • 谢谢,效果很好。我在运行块之前和之后使用NLua.Lua.GetObjectFromPath("_G").Keys,然后使用Enumerable.Except() 来获取添加的内容,这意味着我不必事先知道名称! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2016-05-12
  • 2020-09-12
  • 1970-01-01
  • 2014-09-05
  • 2019-03-08
相关资源
最近更新 更多