2

ライブラリからクラスを初期化するには、次のようにしています。

VALUE obj = rb_funcall(rb_path2class("MyGem::ClassName"),
                rb_intern("new"), 2, arg1, arg2);

その定型コードの多くは、次のようなマクロに凝縮できるように感じます。

VALUE obj = CLASS_INIT("MyGem::ClassName", 2, arg1, arg2)

それとも、funcall、path2class、intern を繰り返してそんなに気になるなら、自分で書かなければならないものですか?

4

1 に答える 1

4

Ruby では文書化されていないようですがREADME.ext、Ruby 拡張機能で使用した という関数がありrb_class_new_instanceます。プロトタイプは基本的に次のとおりです。

rb_class_new_instance(argc, argv, klass);

それはで使用されStringIO.openます:

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/stringio/rdoc/StringIO.html

ここで私がどのようにそれを使用するかを見ることができます:

https://github.com/DavidEGrayson/ruby-usb-pro/blob/master/ext/device_handle.c

于 2012-09-19T15:27:45.417 に答える