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