用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");
}
  }
未完待续...



09-04 07:08