使用来自C的Ruby块和SWIG

时间:2009-11-10 17:41:08

标签: c ruby swig

我正在使用SWIG在Ruby中包装一个C接口。鉴于两个结构

typedef struct Vertex {
  int color, discoverd, finished;
  struct Vertex *next;
} Vertex;

typedef struct Graph {
  struct Vertex *vertex;
} Graph;

如何创建一个产生当前顶点的#each方法,以便我可以在Ruby中处理它。目前我的SWIG接口文件包含类似

的内容
%extend Graph {
  void each() {
    Vertex *v;

    v = self->vertex;
    while(v) {
      rb_yield(Qnil); // how do I yield a vertex?
      v = v->next;
    }
  }
};

提前感谢您的帮助。

- T6D

1 个答案:

答案 0 :(得分:1)

一种方法是使用swig函数将顶点转换为VALUE。将C结构包装为ruby / swig对象的swig函数是SWIG_NewPointerObj。

rb_yield(SWIG_NewPointerObj(SWIG_as_voidptr(v), SWIGTYPE_p_Vertex, 0 |  0 ));

SWIG_NewPointerObj / SWIGTYPE_p_ *被定义为包装器中的宏,因此您需要从包装器调用上面的代码(当使用%extend时会发生这种情况)。