我正在尝试将a native extension of ruby移植到FFI。暴露的ruby界面是
auto_link(text, mode=:all, link_attr=nil, skip_tags=nil, flags=0) { |link_text| ... }
,该块是可选的。
原始c实现中有两个函数:
int rinku_autolink(
struct buf *ob,
const uint8_t *text,
size_t size,
autolink_mode mode,
unsigned int flags,
const char *link_attr,
const char **skip_tags,
void (*link_text_cb)(struct buf *ob, const struct buf *link, void *payload),
void *payload)
执行实际工作和
static VALUE rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
处理默认参数和阻止回调的东西。
我的问题是我是否想要在FFI中公开相同的ruby接口,上面的一个函数应该用attach_function
注册,还是应该为FFI定义另一个c函数?以及选择如何在attach_function
中定义默认参数值的函数?
答案 0 :(得分:0)
答案是 。我认为你误解了FFI的观点,或者我误解了你的帖子。如果要将原生扩展移植到FFI,这应该意味着您要删除代码库中的所有C代码并将其转换为Ruby。您应该将旧C方法rinku_autolink()
和rb_rinku_autolink()
的功能转换为Ruby,可能是单个Ruby方法。然后,如果该Ruby方法需要调用某些C函数,您将使用FFI的attach_function
方法来访问这些函数。
如果那不是你在做什么,你能解释一下你的实际目标是什么以及为什么?