【发布时间】:2011-06-22 15:58:50
【问题描述】:
如果我有 Foo::Bar 用 Ruby 编写,并且我想向 Bar 添加一个方法作为 C 扩展。现在当我像这样在 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。如何扩展而不覆盖它?
【问题讨论】:
-
查看名为“RubyInline”的 gem。它被名为“image_science”的 gem 使用,它调用 c 代码来操作图像。
-
是的,我知道 RubyInline,但宁愿不使用它,因为它不支持所有数据类型。我还将写很多 C,最好把它们分开。
-
我假设您实际上已经在您的 Ruby 代码中的某处定义了 Foo::Bar#original_ruby_method - 这在您的示例中没有看到?
标签: c ruby inline ruby-c-extension