GetNumber 函数不是't doing exactly the same as the lua snippet you' . 特别是 GetNumber 从注册表中获取 "Func2" 的值,而您的lua代码段从 Func1() 返回的表中获取 "Func2" 的值 . 除非您确定 registry.Player.Func2 == Func1().Func2 始终为真,否则您的C版本将不会有相同的行为 .
让我们分解 Func1():Func2().Table1.value1 以更明确的步骤来帮助C翻译:
获取与 _G.Func1 相关的功能
调用该函数并获取表格
从步骤2中返回的表中获取与 "Func2" 关联的函数
调用该函数并将步骤2中的表作为参数传递 . 获取另一个表作为结果
我发现在执行操作时跟踪堆栈包含的内容是有帮助的:
int GetNumber()
{
// Func1()
gclientlua.lua_getfield(LUA_GLOBALSINDEX, "Func1"); // Func1
g_clientlua.lua_call(0, 1); // {}
// Func2( {} )
g_clientlua.lua_getfield(-1, "Func2"); // {}, Func2
g_clientlua.lua_insert(-2); // Func2, {}
g_clientlua.lua_call(1, 1); // {}
if( g_clientlua.lua_type(-1) != LUA_TTABLE )
{
g_clientlua.lua_pop(1);
return 0;
}
// {}.Table1
g_clientlua.lua_getfield(-1, "Table1"); // {}, {}(Table1)
if( g_clientlua.lua_type(-1) != LUA_TTABLE )
{
g_clientlua.lua_pop(2);
return 0;
}
// tonumber( Table1.value1 )
g_clientlua.lua_getfield(-1, "value1"); // {}, {}(Table1), value1
int retn = g_clientlua.lua_tointeger(-1);
g_clientlua.lua_pop(3);
return retn;
}
请注意, GetNumber 会在返回之前弹出它放在堆栈上的所有参数 . 这可以确保 GetNumber 以找到它的方式离开lua堆栈 . 如果您使用C,这可以通过RAII实现自动化 .