Доступ к переменным Lua в userdata из C api
Я работаю над проектом, написанным на C++, который использует Lua в качестве языка сценариев. Чтобы облегчить отладку, мы реализовали сетевой отладчик, который получает код Lua, запускает его, кодирует возвращаемые значения в Json и отправляет эту строку обратно.
Мне удалось реализовать это для таблиц, но теперь я застрял с переменными, хранящимися в пользовательских данных. Например, у меня есть этот код Lua:
Elements.Avatar.testVar = 5
Elements.testVar = 15
return Elements
// result
{
"result0": "{Application:userdata; Avatar:userdata; Physics:userdata; testVar:15; }"
}
Application
, Avatar
а также Physics
являются объектами, которые были созданы в C++. Два testVars
однако были созданы в сценарии выше.Elements
таблица, поэтому я могу перечислить все элементы, но Avatar.testVar
кажется скрытым, потому что Avatar
это LUA_TUSERDATA
,
Кто-нибудь есть идеи, как я могу обнаружить переменные, которые были добавлены в userdata в Lua?
1 ответ
Не существует такой вещи, как "переменная, хранимая в пользовательских данных", по крайней мере, не так, как это касается Lua. С точки зрения Lua, userdata - это гигантский черный ящик. Все Avatar.testVar = 5
это называется метаметод __newindex
в Avatar
со строкой testVar
и новое значение 15
, То, как ваш метаметод C++ (поскольку только код C++ может помещать метаметоды в пользовательские данные) интерпретирует это, полностью зависит от вашего кода.
Так что это невозможно сделать с Луа. Ваш код должен будет содержать отладочные хуки. Lua 5.2 позволяет реализовать __pairs
а также __ipairs
метаметоды, которые pairs
а также ipairs
функции могут использовать для перебора ваших значений. Помимо этого, вы сами по себе запрашиваете то, что существует и не существует в пользовательских данных.