C# 我是否可以创建一个没有Lua函数名称的NLua.luaffunction?
我试图创建一个方法,用于计算字符串并为其中包含的函数返回一个LuaFunction对象。这些字符串将由用户输入,因此我无法事先知道函数的名称。示例字符串:C# 我是否可以创建一个没有Lua函数名称的NLua.luaffunction?,c#,lua,nlua,C#,Lua,Nlua,我试图创建一个方法,用于计算字符串并为其中包含的函数返回一个LuaFunction对象。这些字符串将由用户输入,因此我无法事先知道函数的名称。示例字符串: function doSomething() print('x') end 我希望luaffunction指向doSomething 我能够使用正则表达式捕获函数名,然后使用NLua.Lua.GetFunction,但这不适用于函数中的函数 现在,我的代码使用KeraLua.Lua.LoadString并为LoadString创建的
function doSomething()
print('x')
end
我希望luaffunction指向doSomething
我能够使用正则表达式捕获函数名,然后使用NLua.Lua.GetFunction,但这不适用于函数中的函数
现在,我的代码使用KeraLua.Lua.LoadString并为LoadString创建的块返回一个LuaFunction。这种方法可以工作,但它意味着LuaFunction不能接受args
与我想要的类似,但我不能强制函数成为表的成员,如图所示。您必须使用
DoString
而不是LoadString
LoadString
不执行代码,它只是编译代码以便稍后运行,因此它不在状态中定义函数。必须为GetFunction
或索引定义函数才能工作
如果输入字符串只是一个函数定义,则可以执行以下任一操作:
Lua state=newlua();
state.DoString((string)s)//通过执行输入定义处于状态的函数。
luaffunction f1=state.GetFunction(“doSomething”);
f1.调用(“f1”);
LuaFunction f2=(LuaFunction)状态[“doSomething”];
f2.调用(“f2”);
用户输入示例:
功能剂量仪
印刷品
结束
此解决方案不包括本地函数或存储在表中的函数。您必须使用
DoString
而不是LoadString
LoadString
不执行代码,它只是编译代码以便稍后运行,因此它不在状态中定义函数。必须为GetFunction
或索引定义函数才能工作
如果输入字符串只是一个函数定义,则可以执行以下任一操作:
Lua state=newlua();
state.DoString((string)s)//通过执行输入定义处于状态的函数。
luaffunction f1=state.GetFunction(“doSomething”);
f1.调用(“f1”);
LuaFunction f2=(LuaFunction)状态[“doSomething”];
f2.调用(“f2”);
用户输入示例:
功能剂量仪
印刷品
结束
此解决方案不包括本地函数或存储在表中的函数。我认为,如果不通过表访问函数,就无法访问其他匿名函数。您能接受
sometable.function
作为输入吗?使用正确的输入,您可以使用该输入访问函数。它们不是非函数,我只是不知道名称。抱歉,可能误解了问题,您是否正在尝试获取用户刚刚编写的函数的名称,输入是整个函数?是的,好吧,我的意思是我需要得到没有标识符名称的函数。函数定义格式是强制的吗?您可以定义它doSomething=function()…
,无论是否进行local
,您也可以在表中定义它,甚至在全局范围内定义它\u G['doSomething']=function()…这些都在解决方案的范围内吗?我不相信您可以在不通过表访问的情况下访问其他匿名函数。您能接受sometable.function
作为输入吗?使用正确的输入,您可以使用该输入访问函数。它们不是非函数,我只是不知道名称。抱歉,可能误解了问题,您是否正在尝试获取用户刚刚编写的函数的名称,输入是整个函数?是的,好吧,我的意思是我需要得到没有标识符名称的函数。函数定义格式是强制的吗?您可以定义它doSomething=function()…
有或没有过程local
,您也可以在表中甚至全局中定义它['doSomething']=function()…
这些都在解决方案的范围内吗?谢谢,效果很好。我在运行区块前后使用了NLua.Lua.GetObjectFromPath(“\u G”).Keys
,然后执行了Enumerable.Exception()
,以获取添加的内容,这意味着我不必事先知道名称!)谢谢,做得很好。我在运行区块前后使用了NLua.Lua.GetObjectFromPath(“\u G”).Keys
,然后执行了Enumerable.Exception()
,以获取添加的内容,这意味着我不必事先知道名称!)