C 卢阿;隐式全局状态

C 卢阿;隐式全局状态,c,lua,embedded-language,C,Lua,Embedded Language,目前,我正在将Lua集成到我的项目中,在这一过程中,我面临着一个小的设计问题。目前,如果我想将主机应用程序中的信息输入到Lua脚本中,我将以以下方式调用我在C中注册的函数: -- Inside lua local state = host.get_state() -- Do something with "state" 现在的问题是:状态可以明显改变,“state”变量将过时,很可能无效。到目前为止,我一直生活在这种情况下,因为不太需要全球国家。在以下场景中问题更大: local user =

目前,我正在将Lua集成到我的项目中,在这一过程中,我面临着一个小的设计问题。目前,如果我想将主机应用程序中的信息输入到Lua脚本中,我将以以下方式调用我在C中注册的函数:

-- Inside lua
local state = host.get_state()
-- Do something with "state"
现在的问题是:状态可以明显改变,“state”变量将过时,很可能无效。到目前为止,我一直生活在这种情况下,因为不太需要全球国家。在以下场景中问题更大:

local user = host.get_user('id')
host.set_user_flags(user, 'abc')
-- internally "user" is now updated, but to get the accurate information in Lua, I
-- will have to explicitly redo "user = host.get_user('id')" for every operation
-- that accesses this table
我读过一些关于推荐人的书,我认为他们可以帮我解决这个问题,但我并不真正理解


难道没有什么方法可以像我在C中那样随意使用指针吗?

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

local count
function MyFunc()
      count = 1
end
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); */
有“本地”并不一定

作为替代方案,我建议您使用非安全方法:

count = 0
function MyFunc(v) --we will throw varname as a string inside
     _G[v] = 1 -- _G is a global environment
end
MyFunc('count')
print(count)

我发现表是作为引用传递的,我可以从函数内部修改它们,如下所示:

local count
function MyFunc()
      count = 1
end
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

该函数是在C中定义的,刚刚注册到Lua中,我需要一个Lua C API方法来实现这一点,请参阅Lua参考手册中的Lua_setlocal和Lua_getlocal C函数。