2009-01-30 1 views
1

J'ai inclus Ruby dans mon application C++. J'ai généré les liaisons en utilisant SWIG. Fondamentalement, je lance le fichier ruby, puis Ruby prend le relais et appelle ma classe C++. En fonction de ma question précédente, je voudrais ramener l'instance actuelle de la classe définie dans le fichier ruby ​​à la classe C++ pour pouvoir exécuter des méthodes d'instance.Comment obtient-on l'instance d'une classe Ruby s'exécutant dans le fichier RB actuel? (Incorporation de Ruby en C++)

J'exécuter le fichier ruby ​​comme suit:

rb_eval_string_protect(<ruby script string>, &status); 

rb_funcall(Qnil, rb_intern("main"), 0); 

La méthode globale principale dans le script crée une instance de la classe définie dans le fichier. C'est l'exemple que je suis après.

Si je dois, j'ajouterai un paramètre ou une autre fonction pour renvoyer l'instance, cependant, je ne suis pas sûr comment définir cela en C++ de sorte que lorsque SWIG génère la liaison, tout fonctionne bien.

Toute aide serait appréciée.

Question précédente: Calling Ruby class methods from C++

+0

Peut-être que vous pourriez inclure un lien vers la vous « question précédente » référence. –

Répondre

1

Le C api pour le rubis fait de son mieux pour préserver la nature fonctionnelle de rubis, de sorte rb_eval_string_protect() retourne la valeur de la dernière ligne du script donné, et rb_funcall() renvoie la valeur de la dernière ligne de la méthode invoquée.

Donc l'astuce est vraiment de penser à comment obtenir cette valeur d'instance en rubis pur? Si c'est juste la valeur de retour de la principale, comme

# I'm a ruby script! 
main_retval = main() 

capturant ensuite la valeur de retour dans C est similaire:

// I'm some C (or C++) code 
VALUE main_retval; 
// ... 
rb_eval_string_protect("...", &status); 
main_retval = rb_funcall(Qnil, rb_intern("main"), 0); 

Et vous donnerait une référence à l'objet rubis retourné par main.

Vous pouvez utiliser cet objet comme normal, appeler des méthodes et autres

VALUE main_retval_as_string = rb_funcall(main_retval, rb_intern("to_s"), 0); 
+0

Cela a fonctionné parfaitement. Je vous remercie. –