Zuerst der recht simple C-Code:
/* Datei: embedding.c */
#include "ruby.h"
static VALUE sendeGrussAnC(VALUE self, VALUE str)
{
printf("Ruby hat uns den Gruss gesendet: %s\n",
StringValuePtr(str));
}
int main (int argv[], int argc)
{
VALUE cModul;
VALUE gruss;
printf("Ein Hallo von C\n");
ruby_init; // Dieser Aufruf ist zwingend
cModul = rb_define_module("CModul");
rb_define_module_function(cModul,
"sendeGrussAnC", sendeGrussAnC, 1);
rb_require("./embedding.rb"); // Ruby-Modul laden
// C-String -> Ruby-Objekt
gruss = rb_str_new2("Es Gruessli von C");
rb_funcall(cModul, rb_intern("sendeGrussAnRuby"),
1, gruss);
ruby_run;
}
Erst durch rb_define_module_function wird
die C-Funktion sendeGrussAnC in Ruby zugänglich.
In einer C++-Anwendung empfiehlt sich das
Facade-Entwurfsmuster [GOF94], um die gewünschte
Schnittstelle zusammenzustellen.
Das Ruby-Skript embedding.rb enthält:
# Datei : embedding.rb
print("Ein Hallo von Ruby\n")
module CModul
def CModul.sendeGrussAnRuby(grussVonC)
print ("C hat uns einen Gruss geschickt:
#{grussVonC}\n")
end
end
CModul.sendeGrussAnC("Aloah von Ruby")
Die Ausgabe hierzu sieht wie folgt aus:
$ ./embedding.exe Ein Hallo von C Ein Hallo von Ruby Ruby hat uns einen Gruss gesendet: Aloah von Ruby C hat uns einen Gruss geschickt: Es Gruessli von C