Lua和隐式全局状态

我目前正在将Lua集成到我的项目中,并且在此过程中遇到了一个小的设计问题。目前,如果我想要从我的宿主应用程序中获取信息到Lua脚本中,我会以这种方式调用在C中注册的函数:

-- 在Lua中
local state = host.get_state()
-- 对“state”执行某些操作

现在问题在于:状态显然可以更改,“state”变量将会过时并且很可能无效。到目前为止,我还在与此共存,因为全局状态并不经常需要。在以下情况下更加棘手:

local user = host.get_user('id')
host.set_user_flags(user, 'abc')
-- 在内部,现在已经更新了“user”,但为了在Lua中获取精确信息,
-- 每次访问该表的操作我都必须明确地重复“user = host.get_user('id')”

我已经阅读了一些关于引用的文章,我认为它们可以帮助我解决这个问题,但我并没有真正理解它。难道没有办法像在C中那样轻松地传递指针吗?

原文链接 https://stackoverflow.com/questions/5166448

点赞
stackoverflow用户483603
stackoverflow用户483603

任何你在函数内使用的链接都不会改变函数外部的变量。你应该像这样使用:

local count
function MyFunc()
      count = 1
end

这里 local 并不是必需的。

作为另一种选择,我可以建议您使用非安全方法:

count = 0
function MyFunc(v) --我们将作为字符串传递变量名
     _G[v] = 1 -- _G 是全局运行环境
end
MyFunc('count')
print(count)
2011-03-02 11:06:32
stackoverflow用户280656
stackoverflow用户280656

我发现在 Lua 中,表是以引用的方式传递的,因此我可以在函数内部对其进行修改,代码如下:

static int dostuff(lua_State *L)
{
    lua_pushstring(L, "b");
    lua_pushnumber(L, 23);
    lua_settable(L, 1);

    return 0;
}
/* lua_register(L, "dostuff", &dostuff); */

在 Lua 中调用:

t = { a = 'a', b = 2 }

print(t.a, t.b)
dostuff(t)
print(t.a, t.b)

将会得到:

a   2
a   23
2011-03-02 12:40:44