Есть ли способ связать переменную-член Lua как вызов функции C / C ++ с именем этой переменной - PullRequest
0 голосов
/ 25 февраля 2019

Я совершенно новичок в 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

1 Ответ

0 голосов
/ 25 февраля 2019

У объекта player должен быть набор метатаблицы с полями __index / __newindex, установленными на функцию C, которая будет вызываться, когда Lua пытается прочитать или записать поле, которого нет в объекте Lua.

Обычно объект Lua, представляющий нативный объект (player в вашем случае), будет userdata, либо хранящим указатель на объект C ++, либо размещающим его в своем хранилище.

Метаметоды __index / __newindex будут получать в аргументах ссылку на запрашиваемый объект, значение ключа (например, ваше поле score) и значение, которое нужно сохранить в случае метаметода __newindex.Таким образом, вы можете легко найти свой собственный объект и желаемое свойство.

Некоторые люди предпочитают использовать существующие решения для привязки - tolua ++ / sol / luabind / и т. Д., Но реализовать необходимую функциональность самостоятельно очень просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...