ruby c 扩展内部结构

标签 ruby ruby-c-extension

readme.ext ,在 ruby​​ 指南中链接为开发 ruby​​ 扩展的主要资源之一,声明如下:

Notice Ruby does not allow arbitrary pointer values to be a VALUE. They should be pointers to the structures which Ruby knows about. The known structures are defined in <ruby.h>.

所以,

  1. 如何在对象中保留任意结构而不暴露它?
  2. 是否有比 ruby guides 上引用的资源更完整的资源? ?虽然我可以在 ruby​​ C 代码中找到我需要调用的函数,但很难在源代码中找到像上面代码那样的直接答案。

谢谢!

最佳答案

这涵盖了所有基础知识,包括如何使用 C 结构作为 Ruby 对象进行托管公开、所有宏和函数如何工作以及对许多函数的引用:http://media.pragprog.com/titles/ruby3/ext_ruby.pdf

如何管理与 Ruby 对象关联的 C 对象部分取决于您要建立的关系。您可以简单地从 C 中创建常规的 Ruby 对象,例如只加速一两个复杂的数学运算。然后您将更多地使用 VALUE,至少在所有方法的输入上。您还可以通过这种方式访问​​ Ruby 的所有动态和内省(introspection),因此可以通过查找对象中感兴趣的实例变量来处理实例变量,而无需提前知道它们的名称。

但是,ruby.h 中的宏和辅助函数有助于 Hook Ruby 的 C 结构和任意 C 数据的垃圾回收 - 通常通过 malloc 管理的类型>。例如,Data_Wrap_Struct 函数允许您创建一个对象,当您在扩展中处理它时,它实际上是一个 C 结构,但否则将作为常规 Ruby 对象处理(用于分配给变量等)。请参阅我链接的文档中的 CD Jukebox 示例 - 您需要使用几个相关函数来确保您的代码与 Ruby 的内存管理一起正确播放。

关于ruby c 扩展内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390404/

相关文章:

c++ - 如何在 Ubuntu 中编译一个没有编译器强化的 gem?

ruby - 有哪些好方法可以反转嵌套哈希?

c - 如何编译/创建使用 c 的 ruby​​ 扩展?

Ruby C 绑定(bind)与系统调用的 Ruby 包装器

ruby - extconf.rb 如何定义要使用的源文件

c - 参数错误: string contains null byte when use StringValueCStr

ruby - 使用 Poltergeist 时如何获取元素的 HTML?

ruby-on-rails - 没有路由匹配 { :action= >"completed", :controller= >"lifetimes", :lifetime_id=>14} 缺少必需的键:[:id]

ruby-on-rails - 目录 : Best way to build 'dashboard' type page?

c - 如何避免 Ruby 扩展中的跨线程冲突?