В настоящее время я работаю над проектом, в котором наша команда разрабатывает игру, все мы владеем ruby, а некоторые (но не все) владеют c ++.
Изначально мы сделали бэкэнд в ruby, но портировали его на c ++ для большей скорости. Порт c ++ серверной части имеет те же функции и алгоритмы, что и исходный код ruby.
Тем не менее, у нас все еще есть куча кода в ruby, который делает полезные вещи, но мы бы предпочли не переносить все это, поэтому мы хотим продолжать использовать код ruby и получать данные из классов c ++. Это нереально?
Нашей первой мыслью было, что мы можем сохранить некоторые структуры данных в формате XML или redis и назвать это, но некоторым разработчикам эта идея не нравится.
Нам не нужно передавать какие-либо особенно сложные структуры данных между различными частями кода, только кортежи, строки и целые числа.
Есть ли способ интегрировать код ruby, чтобы он мог вызывать вещи с ++ изначально?
Нужно ли будет вставлять код? Придется ли делать рубиновое расширение? Если да, есть ли какие-нибудь хорошие ресурсы / учебные пособия, которые вы могли бы предложить?
Например, скажем, у нас есть такой код в бэкенде c ++:
class The_game{
private:
bool printinfo; //print the player diagnostic info at the beginning if true
int numplayers;
std::vector<Player*> players;
string current_action;
int action_is_on; // the index of the player in the players array that the action is now on
//more code here
public:
Table(std::vector<Player *> in_players, std::vector<Statistics *> player_stats ,const int in_numplayers);
~Table();
void play_game();
History actions_history;
};
class History{
private:
int action_sequence_number;
std::vector<Action*> recent_actions;
public:
void print_history();
void add_action(Action* the_action_to_be_added);
int get_action_sequence_number(){ return action_sequence_number;}
bool history_actions_are_equal();
int last_action_size(int street,int number_of_actions_ago);
History();
~History();
};
Есть ли какой-нибудь способ вызвать что-то в файле actions_history через объект The_game в ruby? (Все объекты в исходном коде ruby имеют одинаковые имена и функциональность)
Под этим я подразумеваю:
class MyRubyClass
def method1(arg1)
puts arg1
self.f() # ... but still available
puts cpp_method.the_current_game.actions_history.get_action_sequence_number()
end
# Constructor:
def initialize(arg)
puts "In constructor with arg #{arg}"
#get the c++ object here and call it cpp_method
end
end
Возможно ли это? Любые советы или предложения приветствуются.