【问题标题】:retrieving the module object on Lua在 Lua 上检索模块对象
【发布时间】:2014-10-09 07:28:52
【问题描述】:

我有一个使用 Lua 运行一些脚本的 C 程序。我需要通过luaopen_socket_core(myLuaState) 之类的 C 代码打开 Lua 库,由于某些原因,我无法从 Lua 代码中加载模块,例如 socket = require "luasocket"

一旦理解了这个程序的想法,现在我需要加载一个名为 struct 的库,所以我将 struct.c 添加到我的项目中,当我尝试使用它的函数时,如 struct.unpack 运行时抱怨那里没有名为struct 的全局变量。当然,它加载了luaopen_struct(myLuaState),而不是struct = require "struct",这对我来说是禁止的。

关于让这个struct 变量可用的方法有什么建议吗?

【问题讨论】:

  • 试试struct = package.loaded.struct

标签: lua lua-api


【解决方案1】:

看看辅助库中的luaL_requiref,它模仿了从Lua调用的require

您可能直接调用了 open-function 并忘记手动设置这些变量,该函数会为您完成所有工作。

【讨论】:

  • 为什么这可能会有所帮助?开放函数luaopen_struct 调用luaL_register,因此全局structpackage.loaded 已经正确设置。
  • @EgorSkriptunoff:看来你的模块初始化函数表现不佳。一个模块不应该注册自己,而是让调用者按照他的意愿注册它:只需返回模块表。
  • 是的,这就是答案,现在它工作得非常好。谢谢。
  • @Deduplicator - 请下载源代码并查看struct.c:393(函数LUALIB_API int luaopen_struct)。这个函数“行为不端”吗?
  • @EgorSkriptunoff:不。请仔细查看第 40-44 和 393-396 行:对于 Lua 5.2 (2011) 和更新版本,它只返回表,因为它应该。 (从问题中获取链接)他们需要一些时间来弄清楚如何正确地做模块,特别是当他们改变了支持结构并简化了事情时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多