Я совершенно новичок в Lua.Из того, что я понимаю, можно связать переменные и методы Lua с теми, что на стороне C / C ++.
Но возможно ли связать переменную пользовательского типа с вызовом функции C / C ++, которая может выглядетькак свойства на стороне Lua?
Пример:
// C++
struct player {
int get_value(const std::string& property) const {
auto it = values.find(name);
if (it != values.end()) {
return it->second;
}
return -1;
}
std::map<std::string, int> values;
};
А на стороне Lua:
-- Lua
p = player.new()
print(p.score)
Так что когда я звоню p.score
в Lua, этопереводится в вызов функции player::get_value
на стороне C ++ со значением property
"оценка"?
РЕШЕНИЕ
Спасибо @Vlad занаправления!
Я пришел с использованием sol2 , что, на мой взгляд, является очень хорошей связью библиотеки C ++ с Lua!
Вот как это можно сделать с помощью sol2:
struct Player {
sol::object get(const std::string& key, sol::this_state state) {
const auto& it = values.find(key);
if (it != values.cend()) {
return sol::make_object(state, it->second);
}
return sol::lua_nil;
}
std::map<std::string, int> values;
};
int main() {
Player player;
player.values.emplace("score", 123);
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.new_usertype<Player>("Player", sol::meta_function::index, &Player::get);
lua.set("player", &player);
lua.script(R"(
print("Player score: ", player.score)
)");
return 0;
}
Консольный вывод
Player score: 123