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

标签 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 视为父类(super class),而不是字符串或其他东西。

顺便说一句,这是 C 扩展 API 对 Data_Wrap_Struct 的描述:

将C数据封装成Ruby对象

要将 C 指针包装和对象化为 Ruby 对象(所谓的数据),请使用 Data_Wrap_Struct()。

Data_Wrap_Struct(klass, mark, free, ptr)

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

最佳答案

问题是 Data_Wrap_Struct(klass, mark, free, ptr) 中的 klass 是您要返回的 klass,而不是您要将数据发送到的 klass。所以klass是用C定义和填充的ruby类,然后用这个函数返回给ruby。

关于c - 我应该在 Data_Wrap_Struct 中作为类返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6459147/

相关文章:

c - 使用 linux-kernel 模块发送 UDP 数据包而不使用套接字

c - 验证内存是否已在 C 中初始化

c - 识别编译器产生的汇编程序中的某些组件

ruby - 为什么不推荐使用 Enumerable#each_with_object?

c - 如果从管道读取时 tail 失败怎么办

ruby-on-rails - 数据库锁在 Rails 和 Postgres 中无法正常工作

ruby - 如何在控制台中调用ruby中的某个方法 'disable'

ruby - 庭院和 C 扩展

c - 我如何在 Ruby 的 C 扩展 API 上检索 'standalone' 符号

c - Ruby c 扩展 : How can I catch all exceptions, 包括不是 StandardErrors 的东西?