ruby - 将 C native 方法添加到预先存在的 Ruby 类

标签 ruby ruby-c-extension

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

最佳答案

是的,你可以。在任何一种情况下,您都使用 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(与 Object 的 const_get 相同)方法来获取现有类。

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

rb_define_class 还将为您获取现有类(类似于在 ruby​​ 中重新打开一个类)。如果您尝试定义一个具有父类(super class)的类,而该类已经存在另一个不同的类,它会以类似的方式爆炸。

关于ruby - 将 C native 方法添加到预先存在的 Ruby 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17833236/

相关文章:

c - 如何有效地合并 Ruby C API 中的两个散列?

c - 如何在 Ruby C 扩展中创建 Date 对象?

c - Ruby 扩展链接错误

c - Ruby 全局解释器锁 (GIL) - rb_thread_call_without_gvl

ruby - 如何 "uniq"一个数组,保留每个元素的最后一个副本而不是第一个?

Ruby 模块包含,无法访问包含的方法,只能访问常量

ruby - 登录 vk.com net::http.post_form

c - Ruby C API - 从 ruby​​ 数组到 C 数组

ruby-on-rails - 动态生成一个 `link_to` 到 Controller Action `edit`

ruby-on-rails - "gem install rails"在 mac OS X 上使用 rbenv 给出 FilePermissionError