我应该在Data_Wrap_Struct中作为类返回什么?

时间:2011-06-23 18:50:03

标签: c ruby ruby-c-extension

这是我的精简代码,它隔离了我的问题:

#include "ruby.h"
#include "stdlib.h"

typedef struct HandValues {
    double pair1;
    double pair2;
} HandValues;

static VALUE 
get_pairs_2(self) 
  VALUE self;
{

    HandValues *MadeHand = (HandValues *) malloc(sizeof(HandValues));
    MadeHand->pair1 = 5;

    return Data_Wrap_Struct(self, NULL, NULL, &MadeHand);
}

void Init_ev() {
    rb_eval_string("require './lib/ev/pair_counter'");
    VALUE PairCounter = rb_path2class("EV::PairCounter");
    rb_define_method(PairCounter, "get_pairs_2", get_pairs_2, 0);
}

当我在ruby中调用get_pairs_2时,我收到此错误:

TypeError: wrong argument type EV::PairCounter (expected Class)

我已经确认C正在将EV :: PairCounter视为超类,而不是字符串或其他东西。

顺便说一句,这就是C扩展API对Data_Wrap_Struct所说的内容:

将C数据封装到Ruby对象

要将C指针包装并客观化为Ruby对象(所谓的DATA),请使用Data_Wrap_Struct()。

Data_Wrap_Struct(klass, mark, free, ptr)

Data_Wrap_Struct()返回创建的DATA对象。 klass参数是DATA对象的类。 mark参数是标记此数据指向的Ruby对象的函数。 free参数是释放指针分配的函数。如果这是-1,则指针将被释放。函数mark和free将从垃圾收集器中调用。

1 个答案:

答案 0 :(得分:1)

问题是Data_Wrap_Struct中的klass(klass,mark,free,ptr)是你要返回的klass,而不是你要发送数据的klass。所以klass是一个ruby类,用C语言定义并填充,然后用这个函数返回ruby。