4

C 拡張で記述されたネイティブ メソッドを既存の Ruby クラスに追加する方法を知りたいですか? 新しいRubyクラスを作成できる関数しか見つかりませんでしたが、既存のクラスを返す関数は見つかりませんでした.

4

1 に答える 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 に答える