RubyでFoo::Barを記述していて、C拡張機能としてBarにメソッドを追加したい場合。今、CでFoo :: Barを次のように作成すると、次のようになります。
static VALUE Foo;
static VALUE Bar;
static VALUE
print_string(VALUE self, VALUE string) {
printf("%s", StringValuePtr(string));
return Qnil;
}
void Init_foo() {
Foo = rb_define_module("Foo");
Bar = rb_define_class_under(Foo, "Bar", rb_cObject);
rb_define_method(Bar, "print_string", print_string, 1);
}
しかし、問題は次のとおりです。
ruby-1.9.2-p180 :001 > require 'ext/foo' #=> ["Foo"]
ruby-1.9.2-p180 :002 > f = Foo::Bar.new #=> #<Foo::Bar:0x000001046bce48>
ruby-1.9.2-p180 :003 > f.original_ruby_method
NoMethodError: undefined method `original_ruby_method' for #<Foo::Bar:0x000001046bce48>
したがって、基本的に元のFoo::Barを上書きしています。上書きせずに拡張するにはどうすればよいですか?