从 Lua 脚本中调用由函数返回的函数

给定一个如下的 Lua 文件

-- foo.lua
return function (i)
  return i
end

我该如何使用 C API 加载该文件并调用返回的函数呢? 我只需要使用 luaL_loadfile/ luaL_dostring 开头的函数调用。

点赞
用户415823
用户415823

一个载入的代码块就像一个普通的函数。从 C 语言中载入模块可以通过以下方式实现:

return (function()  -- 我们编译后的代码块

    -- foo.lua
    return function (i)
      return i
    end

end)()  -- 执行函数调用/错误处理

您只需要载入代码块,然后调用它,它的返回值就是您所需的函数:

// 载入代码块
if (luaL_loadstring(L, script)) {
    return luaL_error(L, "Error loading script: %s", lua_tostring(L, -1));
}

// 调用代码块(函数将在堆栈的最上面)
if (lua_pcall(L, 0, 1, 0)) {
    return luaL_error(L, "Error running chunk: %s", lua_tostring(L, -1));
}

// 调用函数
lua_pushinteger(L, 42); // 函数参数(i)
if (lua_pcall(L, 1, 1, 0)) {
    return luaL_error(L, "Error calling function: %s", lua_tostring(L, -1));
}
2016-08-30 18:59:23