Таблица моделирования для lua - PullRequest
1 голос
/ 10 мая 2011

Добрый день

У меня есть конкретная задача дать доступ c ++ std :: map к сценариям lua.Синтаксис желаемого скрипта: glob ["tag"] = "value" или glob ("tag") = "value"

В исследованиях пытались связать luabind

std::string & glob(const std::string &tag)
{
    static std::string value;
    return value;
}

...

luabind::module(&state)
[
    def("glob", &glob, luabind::return_reference_to(result))
]

, но после запускаприведенного ниже сценария

glob("tag") = "asdasd"
print(glob("tag"))

получил ошибку [string "glob (" tag ") =" asdasd "..."]: 1: неожиданный символ рядом с '='

Итак,Я жду ваших предложений и мнений.

Спасибо

Обновление 2lhf: данные глобальных переменных хранятся и сериализуются через часть c ++ и должны быть доступны из lua.luaState создается для каждого выполнения скрипта и не существует между выполнениями.Одним из решений является создание и заполнение таблицы глобальных переменных перед выполнением скрипта и синхронизация с картой после выполнения, но, я думаю, это достаточно медленно.Таким образом, доступ через c-функцию с указанным синтаксисом будет приветствоваться.

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

glob("tag") = "asdasd" никогда не может работать, потому что это неправильный синтаксис Lua. glob["tag"] = "value" может работать. Вам необходимо установить glob в качестве пользовательских данных с index и newindex metamethods. Я ничего не знаю о Луабинде, поэтому я не могу помочь вам там. Но сделать это с помощью стандартного Lua API не сложно. Мне просто интересно , почему вам нужно экспортировать C ++ map в Lua, когда Lua уже имеет превосходные ассоциативные массивы.

0 голосов
/ 11 мая 2011

Да, метатабельные правила.

Просто нужно было вставить какой-то код c, полученный из образцов

lua_createtable(&state, 0, 0);
lua_pushcfunction(&state, &getValue);
lua_setfield(&state, -2, "__index");
lua_pushcfunction(&state, &setValue);
lua_setfield(&state, -2, "__newindex");
lua_setmetatable(&state, -2);
lua_setglobal(&state, "global");

И все работает просто отлично, спасибо

Но вот ещевопрос: почему я должен использовать index == -2 для lua_setfield и lua_setmetatable?

...