Хранение значений в объекте пользовательских данных от lua
Что я хочу сделать, это:
object.foo = "bar"
print(object.foo)
где "объект" - это данные пользователя.
Некоторое время я гуглил (используя ключевые слова __newindex и lua_rawset), но я не могу привести примеры, которые делают то, что я хочу.
Я хочу сделать это с помощью API Lua в C++
3 ответа
Давайте напишем это в коде Lua, чтобы мы могли быстро экспериментировать с кодом
function create_object()
-- ## Create new userdatum with a metatable
local obj = newproxy(true)
local store = {}
getmetatable(obj).__index = store
getmetatable(obj).__newindex = store
return obj
end
ud = create_object()
ud.a = 10
print(ud.a)
-- prints '10'
Если вы работаете с пользовательскими данными, вы, вероятно, захотите сделать выше, используя C API. Однако код Lua должен четко указывать, какие шаги необходимы. (The newproxy(..)
Функция просто создает фиктивные пользовательские данные из Lua.)
Я отказался от попыток сделать это в C++, поэтому я сделал это в lua. Я перебираю все метатаблицы (_R) и назначаю мета-методы.
_R.METAVALUES = {}
for key, meta in pairs(_R) do
meta.__oldindex = meta.__oldindex or meta.__index
function meta.__index(self, key)
_R.METAVALUES[tostring(self)] = _R.METAVALUES[tostring(self)] or {}
if _R.METAVALUES[tostring(self)][key] then
return _R.METAVALUES[tostring(self)][key]
end
return meta.__oldindex(self, key)
end
function meta.__newindex(self, key, value)
_R.METAVALUES[tostring(self)] = _R.METAVALUES[tostring(self)] or {}
_R.METAVALUES[tostring(self)][key] = value
end
function meta:__gc()
_R.METAVALUES[tostring(self)] = nil
end
end
Проблема в том, что я должен использовать для индексации. tostring(self) работает только для тех объектов с идентификатором, возвращенным tostring. Не все объекты имеют такие идентификаторы, как Vec3 и Ang3 и все такое.
Вы также можете использовать простую таблицу...
config = { tooltype1 = "Tool",
tooltype2 = "HopperBin",
number = 5,
}
print(config.tooltype1) --"Tool"
print(config.tooltype2) --"HopperBin"
print(config.number) --5