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>
.
所以,
- 如何在对象中保留任意结构而不暴露它?
- 是否有比 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/