Хранение значений в объекте пользовательских данных от lua - PullRequest
2 голосов
/ 22 августа 2010

Что я хочу сделать, это:

object.foo = "bar"

print(object.foo)

где "объект" - это данные пользователя.

Я уже некоторое время гуглю (используя ключевые слова __newindex и lua_rawset), но я не могу привести примеры, которые делают то, что я хочу.

Я хочу сделать это с помощью API Lua в C ++

Ответы [ 3 ]

3 голосов
/ 22 августа 2010

Давайте напишем это в коде 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 должен четко указывать, какие шаги необходимы. (Функция newproxy(..) просто создает фиктивные пользовательские данные из Lua.)

1 голос
/ 24 августа 2010

Я отказался от попыток сделать это в 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 и все такое.

0 голосов
/ 24 августа 2010

Вы также можете использовать простую таблицу ...

config = { tooltype1 = "Tool",   
        tooltype2 = "HopperBin",   
        number = 5,
        }   

print(config.tooltype1) --"Tool"   
print(config.tooltype2) --"HopperBin"   
print(config.number) --5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...