我如何在Lua中加载一个未命名的函数?

我希望我的 C++ 应用程序的用户能够提供匿名函数来执行小的工作块。

类似这样的小代码块将是理想的。

function(arg) return arg*5 end

现在,我想为我的 C 代码编写一些简单的东西,

// 把函数推到 lua 栈上
lua_xxx(L, "function(arg) return arg*5 end" )
// 保存它以备后用
int reg_index = luaL_ref(L, LUA_REGISTRY_INDEX);

但是我认为 lua_loadstring 不会做“正确的事情”。

我还剩下什么感觉像是一个可怕的 hack?

void push_lua_function_from_string( lua_State * L, std::string code )
{
   // 将我们的字符串包装起来以便我们可以得到 luaL_loadstring 的有用结果
   std::string wrapped_code = "return "+code;
   luaL_loadstring(L, wrapped_code.c_str());
   lua_pcall( L, 0, 1, 0 );
}

push_lua_function_from_string(L, "function(arg) return arg*5 end" );
int reg_index = luaL_ref(L, LUA_REGISTRY_INDEX);

是否有更好的解决方案?

原文链接 https://stackoverflow.com/questions/4823791

点赞
stackoverflow用户221509
stackoverflow用户221509

如果您需要访问参数,您写的方法是正确的。lua_loadstring返回代表您编译的代码块/代码的函数。如果您想要从代码中获取一个函数,就必须使用return语句。我在Lua中也会这样做,用于小型的“表达式求值器”,我不认为这是一种“可怕的hack” :)

如果您只需要某些回调,而没有任何参数,您可以直接编写代码并使用lua_tostring返回的函数。您甚至可以将参数传递给此代码块,它将作为...表达式可访问。然后您可以按如下方式获取参数:

local arg1, arg2 = ...
-- rest of code

您可以决定什么对您更好-在库代码库中使用“丑陋的代码”,还是在Lua函数中使用“丑陋的代码”。

2011-01-28 08:22:52
stackoverflow用户107090
stackoverflow用户107090

请看我的ae。它会从表达式中缓存函数,因此您可以简单地说 ae_eval("a*x^2+b*x+c"),它只编译一次。

2011-01-28 10:20:06