LuaJIT 和 C++ - 在 loadstring/pcall 中调用 Table.Method() 无效

我有两个函数,在 C++ 中注册 Lua 表和方法:

void LuaScriptInterface::registerTable(const std::string& tableName)
{
    // _G[tableName] = {}
    lua_newtable(luaState);
    lua_setglobal(luaState, tableName.c_str());
}

void LuaScriptInterface::registerMethod(const std::string& globalName, const std::string& methodName, lua_CFunction func)
{
    // globalName.methodName = func
    lua_getglobal(luaState, globalName.c_str());
    lua_pushcfunction(luaState, func);
    lua_setfield(luaState, -2, methodName.c_str());

    // pop globalName
    lua_pop(luaState, 1);
}

它们注册一些方法:

registerTable("Game");
// Game.getHouses()
registerMethod("Game", "getHouses", LuaScriptInterface::luaGameGetHouses);

然后在 Lua 中调用:

local param = "print( Game.getHouses() )"
pcall(loadstring(param))

我遇到了 param 的问题。调用和结果:

1. print(Game.getHouses())
2. print(Game['getHouses']())
3. print( Game.getHouses() ) -- 添加空格
4. print( Game['getHouses']() ) -- 添加空格
5. local var = Game.getHouses() print(#var)
6. local var = Game['getHouses']() print(#var)
7. local var = #Game.getHouses() print(var)
8. local var = #Game['getHouses']() print(var)
9. local var = # Game.getHouses() print(var) -- 添加空格

结果:

1. 尝试调用空值
2. table: 0x4351fdd0
3. table: 0x42ce6b88
4. table: 0x426513c0
5. 1010
6. 1010
7. 尝试调用空值
8. 1010
9. 1010

有人能告诉我为什么在 loadstring/pcall 中不起作用的原因吗?

我能用什么方法使它在 loadstring/pcall 中起作用吗?

编辑:

调试了 2 小时后,我发现我用来与执行 LUA 的服务器通信的客户端对我发送的字符串进行了一些正则表达式处理(我还不知道原因,但这与 LUA 无关) :)

点赞
用户9185797
用户9185797

问题在于 someTable.key 给出的结果与 someTable["key"] 不同,但这不可能发生:

但是在将字符串常量用作键值时很常见,因此有一种特殊的快捷语法:

> t = {}
> t.foo = 123 -- 与 t["foo"] 相同(但不是 t[foo],它将变量 foo 用作键)
> = t.foo
123
> = t["foo"]
123

快捷语法仅在字符串由下划线、字母和数字组成,但不应以数字开头时才有效。(http://lua-users.org/wiki/TablesTutorial

由于它在未使用 loadstring 时有效,我怀疑您的问题实际上是与 Player(cid)player:getId()"player:getPosition()" 有关。请注意,您在两个不同的时间访问了 player,即直接使用 player:getId() 和通过 loadstring / pcall。最后一种可能性可能是 Player(cid)。其中一个可能没有正确初始化 / 声明。

我认为由于不同的测试条件,您的第二个尝试 local param = "print( #Game['getHouses']() )" 可能起效。

2019-01-14 10:30:38