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

标签 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​​ 对象的数组。

也许我只是有点累了,但我觉得有一种简单的方法可以完成这项工作,但我只是没有看到。

最佳答案

我在发布这篇文章后意识到我可以柯里化(Currying) 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* 数据参数(这是 C 端的要求)。 肯定还有其他一些方法,如果有人想分享,我很想听听。

关于ruby - 我可以将 ruby​​ 对象指针传递给 ruby​​-ffi 回调吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516431/

相关文章:

mysql - ln :/usr/lib/libmysqlclient. 18.dylib:文件存在

ruby - 有没有办法在不必设置服务器的情况下制作私有(private) Ruby gem?

ruby-on-rails - Rails2.3.8 : How do I run a test using the dev environment? ruby

ruby-on-rails - 使用 Rails 应用程序下载 S3 文件

ruby - 如何将模块中的方法带入 ruby​​ 中方法调用者的范围?

c - 在 Ruby FFI 中声明 char 数组

ruby - 在 ruby​​ 中捕获 Ctrl-c

c - Ruby Fiddle - C 和 Ruby 之间的函数行为不同

c - 是否可以将 ruby​​ ffi 附带的功能设为私有(private)?

ubuntu - 使用 ruby​​ ffi-inliner 编译 tesseract-ocr gem 时出错