readme.ext作为开发 ruby 扩展的主要资源之一在 ruby 指南中链接,它声明如下:
注意 Ruby 不允许任意指针值成为 VALUE。它们应该是指向 Ruby 所知道的结构的指针。已知结构定义在
<ruby.h>
.
所以,
- 如何在我的对象中保存任意结构而不暴露它?
- 是否有比ruby guides中引用的资源更完整的资源?虽然我可以在 ruby C 代码中找到我需要调用的函数,但很难在源代码中找到像上面代码那样的直接答案。
谢谢!
readme.ext作为开发 ruby 扩展的主要资源之一在 ruby 指南中链接,它声明如下:
注意 Ruby 不允许任意指针值成为 VALUE。它们应该是指向 Ruby 所知道的结构的指针。已知结构定义在
<ruby.h>
.
所以,
谢谢!
这涵盖了所有基础知识,包括如何使用 C 结构作为 Ruby 对象进行托管公开,所有宏和函数如何工作,以及对许多函数的引用:http: //media.pragprog.com/titles/ruby3/ ext_ruby.pdf
您如何管理与 Ruby 相关的 C 对象,部分取决于您要建立的关系。您可以简单地从 C 中创建常规的 Ruby 对象,然后只加速一两位复杂的数学运算。然后你会更多地使用VALUE
s,至少在所有方法的输入上。您还可以通过这种方式访问 Ruby 的所有动态和自省,因此可以通过查找对象中感兴趣的对象而不事先知道它们被调用的内容来处理实例变量的扩展。
但是,有一些宏和辅助函数ruby.h
可以帮助挂钩到 Ruby 的 C 结构和任意 C 数据类型的垃圾收集 - 通常通过malloc
. 例如,该Data_Wrap_Struct
函数允许您创建一个对象,当您在扩展中处理它时它实际上是一个 C 结构,但否则将作为常规 Ruby 对象处理(用于分配给变量等)。请参阅我链接的文档中的 CD Jukebox 示例 - 您需要使用几个相关功能来确保您的代码在 Ruby 的内存管理中正确运行。