【问题标题】:Pointer to number指向数字的指针
【发布时间】:2014-08-12 06:59:03
【问题描述】:

似乎在 Lua 中有对数字/布尔值/lightuserdata 的引用这样的事情。但是,在 Lua 中设置指向 C++ 本机类型(例如 float)的全局并在我更改 Lua 中相应的全局时自动更新的最简单方法是什么?

int foo = 2;
//imaginary lua function that does what I want
lua_pushnumberpointer(state,&foo)
lua_setglobal(state,"foo")
-- later, in a lua script
foo = 5; 

最后一行应该在 C++ 端自动更新 foo。实现这样的目标最简单的方法是什么?

【问题讨论】:

  • 将全局表设置为具有将更改推送到int foonewindex 元方法和检索对int foo 的更改的index 元方法。

标签: lua lua-api


【解决方案1】:

查看元表,尤其是标签__index__newindex
如果将它们设置为合适的函数,则可以完全控制设置新索引/查询未设置索引时发生的情况。

这应该可以让你做你想做的一切。

仅将__newindex 设置为自定义函数并将感兴趣的条目保存在__index 上设置的表中可能是有利的。

__newindex 的示例处理程序和 __index 的伴随定义。
不过考虑在本机端实现它,以提高性能,因为__hidden_notify_world() 很可能是本机的。

do
  local meta = getmetatable(_ENV) or {}
  setmetatable(_ENV, meta)
  local backing = {}
  _ENV.__index = backing
  function _ENV:__newindex(k, v)
    if backing[k] ~= v then
      backing[k] = v
      __hidden_do_notify_world(k, v)
    end
  end
end

如果您使用 Lua _G 而不是 _ENV

【讨论】:

  • 我可以设置它以保留我正在寻找的实际语法(foo = 5)吗?或者我是否必须创建一个全局表(我们称之为“basicGlobals”,例如:basicGlobals.foo = 5?
  • 您可以保留 Lua 端、C 端(以及 __newindex 的通知函数)的标准语法,但需要注意实际存储数据的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多