mrubyプチハッカソンに参加してきました例えば mruby-curl は別の mrbgems である mruby-http の HTTP::Response を返しているが特別 require している訳ではない。mrb_class_get でルートネームスペースのモジュールもしくはクラスが取れるので、さらにそこから mrb_const_get で under なクラスが取れる。
例えば、mattn_jpさんがmruby-uvを作っていらっしゃいます。私がその上にTCPServerClassを構築したい、と思ったときには、現状RubyのコードとしてUV::TCP.newするしか無いように感じますが、これをCから呼び出して、mrubyのTCPServerClassとしてexportしたいな、と。
http://onmessage.ws/wordpress/?p=745
struct RClass* _class_http = mrb_class_get(mrb, "HTTP");
struct RClass* _class_http_parser = mrb_class_ptr(mrb_const_get(mrb, mrb_obj_value(_class_http), mrb_intern(mrb, "Parser")));
これはあくまで mruby が「HTTP::Parser」をどの様に解析しているのかを僕がコードを読んで同じ事をやっているだけなので、正しい(薦められるべき)使い方かどうかは分からない。これを使って
struct RClass* _class_my_parser = mrb_define_class_under(mrb, _class_http, "MyParser", _class_http_parser);
この様にクラス定義すれば HTTP::Parser を継承した HTTP::MyParser を宣言できます。もちろん、mrbgems として同梱されていない場合は実行時エラーになります。