C 拡張で記述されたネイティブ メソッドを既存の Ruby クラスに追加する方法を知りたいですか? 新しいRubyクラスを作成できる関数しか見つかりませんでしたが、既存のクラスを返す関数は見つかりませんでした.
1 に答える
8
はい、できます。どちらの場合でもrb_define_method
(またはrb_define_singleton_method
シングルトンメソッドの場合)使用します。rb_some_function
(self パラメーターに加えて) 1 つのパラメーターを期待するac 関数が呼び出されたと仮定すると、次のようになります。
rb_define_method(someClass,
"some_function",
RUBY_METHOD_FUNC(rb_some_function),
1);
someClass が新しく作成されたクラス (rb_define_class_under
またはで作成rb_define_class
) であるか、既存のクラスであるかは、あなた次第です。rb_const_get
(オブジェクトの と同じ) メソッドを使用const_get
して、既存のクラスを取得できます。
someClass = rb_const_get(rb_cObject, rb_intern("SomeClass"));
rb_define_class
また、既存のクラスをフェッチします (Ruby でクラスを再度開くのと同様)。スーパークラスでクラスを定義しようとして、そのクラスが別のクラスで既に存在する場合、同様の方法で爆発します。
于 2013-07-24T12:11:56.137 に答える