问题描述
|
这是我的简化代码,隔离了我的问题:
#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。