用ruby编程的时候,可能要调用底层系统的东东,如果能用C编写的底层代码来扩展ruby则大大的增加了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;
//返回默认大小的新array
arr = rb_ary_new();
// VALUE rb_iv_set(VALUE obj,char *name,VALUE value)
将指定对象obj中的实例变量name(必须以@为前缀)的值设置为value。返回value
rb_iv_set(self,"@arr",arr)
return self;
}
static VALUE t_add(VALUE self,VALUE obj)
{
VALUE arr;
//VALUE rb_iv_get(VALUE obj,char *name)
返回指定对象obj中的实例变量name(必须以@为前缀)
arr=rb_iv_get(self ,"@arr");
/VAlUE rb_funcall(VALUE recv,ID id,int argc ,..)
调用recv对象中有id指定的方法,argc是参数的个数,后面是实际的参数(可能没有参数)
rb_funcall(arr,/id_push,1,obj);
return arr;
}
VALUE cTest;
void Init_my_test()
{
//VALUE rb_define_class(char *name,VALUE superclass)
用给定的name 和superclass(对Object类使用rb_cObject)定义一个顶层的类
cTest = rb_define_class("MyTest",rb_cObject);
//void rb_define_method(VALUE classmod,char *name,VALUE(*func)(),int argc)
用给定的name在classmod类或模块中定义一个实例方法,有C函数func实现并接收argc个参数
rb_define_method(cTest,"initialize",t_init,0);
rb_define_method(cTest,"add",t_add,0)
//返回指定name对应的ID。如果名字不存在,会为他创建一个符号表项
id_push=rb_intern("push");
}
}
未完待续...
阅读(2958) | 评论(0) | 转发(0) |