将C本机方法添加到预先存在的Ruby类中

时间:2013-07-24 11:52:14

标签: ruby ruby-c-extension

我想知道如何将C扩展中编写的本机方法添加到预先存在的Ruby类中?我只找到了允许你创建新Ruby类的函数,但没有找到返回预先存在的类的函数。

1 个答案:

答案 0 :(得分:8)

是的,你可以。在任何一种情况下,您都使用rb_define_method(或rb_define_singleton_method用于单例方法)。假设你有一个名为rb_some_function的c函数,它需要1个参数(除了self参数)你会做

rb_define_method(someClass, 
                 "some_function", 
                 RUBY_METHOD_FUNC(rb_some_function),
                 1);

取决于someClass是一个新创建的类(使用rb_define_class_underrb_define_class创建)还是现有类。您可以使用rb_const_get(与对象的const_get)方法相同来获取现有类。

someClass = rb_const_get(rb_cObject, rb_intern("SomeClass"));

rb_define_class也会为你取一个现有的类(类似于在ruby中重新打开一个类)。如果您尝试使用超类定义一个类并且该类已经存在并且具有不同的类,那么它将以类似的方式爆炸。