深入探索:用C语言扩展Ruby的技术与实践
1. 用C扩展Ruby的概述
在Ruby中编写代码来扩展其功能相对容易,但有时需要与底层事物进行交互。一旦开始添加用C编写的底层代码,扩展的可能性就变得无穷无尽。例如,为Sunset Diner and Grill构建一个定制的联网点唱机,它可以播放硬盘上的MP3音频文件或CD点唱机中的音频CD,并且希望通过Ruby程序控制该点唱机的硬件。硬件供应商提供了C头文件和二进制库,我们的任务是构建一个Ruby对象,使其能够进行适当的C函数调用。
2. 编写第一个扩展
为了介绍扩展编写,我们来编写一个简单的扩展。这个扩展纯粹是对扩展编写过程的测试,它所实现的功能用纯Ruby也能完成。以下是对应的Ruby类:
class MyTest
def initialize
@arr = Array.new
end
def add(obj)
@arr.push(obj)
end
end
对应的C代码如下:
#include "ruby.h"
static int id_push;
static VALUE t_init(VALUE self)
{
VALUE arr;
arr = rb_ary_new();
rb_iv_set(self, "@arr", arr);
return self;
}
static VALUE t_add(VALUE self, VALUE obj)
{
VALUE