0

ruby のネイティブ拡張を FFIに移植しようとしています。公開された Ruby インターフェイスは

auto_link(text, mode=:all, link_attr=nil, skip_tags=nil, flags=0) { |link_text| ... } 

ブロックはオプションです。

元の c 実装には 2 つの関数があります。

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 メソッドの機能を Ruby、おそらく単一の Ruby メソッドに変換する必要がありrinku_autolink()ますrb_rinku_autolink()。次に、その Ruby メソッドがいくつかの C 関数を呼び出す必要がある場合は、FFI のattach_functionメソッドを使用してそれらにアクセスします。

そうでない場合は、実際の目標とその理由を説明していただけますか?

于 2012-09-29T02:39:48.443 に答える