【问题标题】:Where are Lua's "global" local values stored?Lua 的“全局”本地值存储在哪里?
【发布时间】:2018-12-08 06:38:11
【问题描述】:

我需要从 C 中调用一个 Lua 函数,只要该函数是全局的,我可以在全局表中找到它,但是如果它被声明为本地,我如何将地址压入堆栈来调用它?

function MyGlobal()
  print("Global")
end

local function MyLocalGlobal()
  print("Local")
end

从 C 调用 MyGlobal() 不是问题,它可以正常工作。我在全局表中查找函数。

但是我如何从 C 调用MyLocalGlobal()?它不在全局表中,但它在哪里以及如何推送地址?

我正在使用 Lua 5.3.4。

【问题讨论】:

  • 可能MyLocalGlobal 已经不存在了。本地函数在控制退出其词法范围后会进行垃圾回收。

标签: c lua function-call local-functions global-functions


【解决方案1】:

MyLocalGlobal() 函数并不是真正的全局函数。它对于代表整个加载代码块的匿名函数是本地的。

当你打电话给lua_load/lua_loadstring

return function(...) -- implicit functionality outside of code to be loaded

    -- your file starts here --
    function MyGlobal()
      print("Global")
    end

    local function MyLocalGlobal()
      print("Local")
    end
    -- file ends here --

end               -- implicit functionality outside of code to be loaded

您可以稍后使用调试工具(通过“调试”库)获得MyLocalGlobal,或者您应该在该源文件的末尾显式返回所需的接口,然后在本机端获取/读取接口你已经加载/执行了这个块。

【讨论】:

  • 我已经在使用调试库来获取行号等。但我要求已使用正确的堆栈级别初始化 lua_Debug。任何想法如何使用调试库来获取MyLocalGlobal()
  • 这是@Egor 的观点。块运行后,局部变量超出范围,因此函数值将被垃圾收集,除非有其他对它的引用(您显示的代码不会有)。 Vlad 建议您保留另一个参考。顺便说一句,函数是值,因此可以被垃圾收集。函数定义是有效的表达式。像其他表达式一样,您不能只是在某个地方查找它们。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2021-10-18
  • 2017-06-10
  • 2011-01-08
  • 1970-01-01
  • 2017-07-04
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多