似乎在Lua中知道对数字/ boolean / 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。实现这样的最简单方法是什么?
答案 0 :(得分:3)
查看元表,尤其是标记__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< 5.2(2011),您必须使用_G
代替_ENV
。