LuaJIT и C ++ - вызов Table.Method () не работает в loadstring / pcall - PullRequest
0 голосов
/ 08 января 2019

Я получил 2 функции, которые регистрируют таблицу Lua и метод в C ++:

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);

Тогда я звоню в Луа:

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

У меня проблема с param . Звонки и результаты:

1. print(Game.getHouses())
2. print(Game['getHouses']())
3. print( Game.getHouses() ) -- added spaces
4. print( Game['getHouses']() ) -- added spaces
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) -- added space

Результаты:

1. attempt to call a nil value
2. table: 0x4351fdd0
3. table: 0x42ce6b88
4. table: 0x426513c0
5. 1010
6. 1010 
7. attempt to call a nil value
8. 1010
9. 1010

Может кто-нибудь сказать мне причину, почему она не работает в loadstring / pcall ?

Могу ли я заставить его работать в loadstring / pcall как-нибудь?

EDIT:

После 2 часов отладки. Я обнаружил, что клиент, который я использую для связи с сервером - который выполняет LUA - выполняет некоторое регулярное выражение для строки, которую я отправляю (я до сих пор не знаю, почему, но это не связано с LUA) :)

1 Ответ

0 голосов
/ 14 января 2019

Проблема, которую вы пытались представить, состоит в том, что someTable.key дает результат, отличный от someTable["key"], но это невозможно:

Но так часто используют строковые константы в качестве ключей, для них есть специальный синтаксис:

> t = {}
> t.foo = 123 -- same as t["foo"] (but not t[foo], which would use the variable foo as the key)
> = t.foo
123
> = t["foo"]
123

Синтаксис ярлыка действителен, только если строка состоит из символов подчеркивания, букв и цифр, но не должна начинаться с цифры. (http://lua -users.org / вики / TablesTutorial )

Поддерживается тот факт, что он работает, когда не используется в loadstring, я подозреваю, что ваша проблема скорее с Player(cid) player:getId() или "player:getPosition()". Важно отметить, что вы обращаетесь к игроку в два разных времени. 1. Прямо как player:getId() и 2. хотя loadstring / pcall. Последняя возможность будет Player(cid). Возможно, один из них неправильно инициализирован / объявлен.

Я думаю, что из-за разных условий тестирования ваша вторая попытка local param = "print( #Game['getHouses']() )" сработала.

...