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

问题描述

| 这是我的简化代码,隔离了我的问题:
#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,&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函数将从垃圾回收器中调用。     

解决方法

        问题是Data_Wrap_Struct(klass,mark,free,ptr)中的klass是您要返回的klass,而不是要将数据发送到的klass。因此klass是在C中定义并填充的ruby类,然后使用此函数返回到ruby。