我可以将ruby对象指针传递给ruby-ffi回调吗?

我真的可以在这个方向上使用正确的方向.

鉴于此C代码:

typedef void cbfunc(void *data);
void set_callback(cbfunc* cb);
//do_stuff calls the callback multiple times with data as argument
void do_stuff(void *data);

这个Ruby代码:

module Lib
    extend FFI::Library
    # ...
    callback :cbfunc, [:pointer], :void
    attach_function :set_callback, [:cbfunc], :void
    attach_function :do_stuff, [:pointer], :void
end

有没有办法可以将ruby数组作为回调数据传递,如:

proc = Proc.new do |data|
    # somehow cast FFI::Pointer to be a ruby array here?
    data.push(5)
end
Lib::set_callback(proc)
Lib::do_stuff(ptr_to_a_ruby_obj_here)

问题是回调将被多次调用,我需要一种方法来轻松构建各种ruby对象的数组.

也许我只是有点累,但感觉有一个简单的方法来完成这个,我只是没有看到它.

最佳答案 在发布之后我意识到我可以讨论Proc并将其用作回调.

所以类似于:

proc = Proc.new do |results, data|
    results.push(5)
end
results = []
callback = proc[results]
Lib::set_callback(callback)
Lib::do_stuff(nil) # Not concerned with this pointer anymore

我刚刚切换到忽略void * data参数(这是C方面的要求).
必须有其他几种方式,如果有人想分享,我有兴趣听到它们.

点赞