1

現在、C 拡張機能を使用して作成された一連のオブジェクトがあるので、それらは

  • フー
  • バー
  • バズ。

それらの 3 つをインスタンス化し、それらの関数を呼び出し、結果を処理する ruby​​ コードがあります。それを呼びましょう:

  • マネジャー

さて、今は Manager がボトルネックになっているので、C 拡張にしたいと思います。しかし、Manager 内から Foo、Bar、および Baz をインスタンス化する方法がわかりません。次のようなコードを使用する必要がありますか?

VALUE module_klass = rb_const_get(rb_cObject, rb_intern("Module"));
VALUE object_klass = rb_const_get(module_klass, rb_intern("Foo"));

そして、次のようなメソッドを呼び出します。

rb_funcall(object_klass, rb_intern("new"), 0);     

または、よりクリーンな方法はありますか?

4

1 に答える 1

4

チェックアウトしてくださいrb_class_new_instance()。あなたは次のようなことをします:

VALUE module_klass = rb_const_get(rb_cObject, rb_intern("Module"));
VALUE foo_klass    = rb_const_get(module_klass, rb_intern("Foo"));
VALUE foo          = rb_class_new_instance(0, NULL, foo_klass);
VALUE data         = rb_funcall(foo, rb_intern("some_foo_method"), ...);
于 2011-07-01T20:56:34.310 に答える