0

我正在尝试将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

4

1 回答 1

0

答案是否定。我认为您误解了 FFI 的观点,或者我误解了您的帖子。如果您将本机扩展移植到 FFI,这应该意味着您将摆脱代码库中的所有 C 代码并将其转换为 Ruby。您应该将旧 C 方法的功能转换rinku_autolink()rb_rinku_autolink()Ruby,可能是单个 Ruby 方法。然后,如果该 Ruby 方法需要调用一些 C 函数,您将使用 FFI 的attach_function方法来访问这些函数。

如果那不是您正在做的事情,您能否解释一下您的实际目标是什么以及为什么?

于 2012-09-29T02:39:48.443 回答