Я пытаюсь передать a native extension of ruby в FFI. Открытый интерфейс рубинаRuby FFI как определить аргументы по умолчанию
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)
, которая занимается с аргументами по умолчанию и блок обратного вызова вещи.
Мой вопрос в том, хочу ли я открыть тот же интерфейс ruby в FFI, какой из перечисленных функций должен быть зарегистрирован с помощью attach_function
, или я должен определить другую функцию c для FFI? И какую функцию выбрать, как определить значения аргументов по умолчанию в attach_function
?
Я предполагаю, что вы имеете в виду, что я должен определить новую функцию c с именем «auto_link», которая выполняет работу orignal «rinku_autolink», и эта функция должна иметь те же аргументы, что и интерфейс ruby. Затем, как выразить аргументы по умолчанию в этой c-функции? – xiefei
Что вы пытаетесь сделать? –
Мне нужен рубиновый метод 'auto_link (text, mode =: all, link_attr = nil, skip_tags = nil, flags = 0) {| link_text | ...} ', так что я могу назвать его в моем ruby-коде, например' auto_link («go http: // xxx.») {| link | ...} 'и может вызывать его как' auto_link ("go http: // xxx.",: another_mode, non_default_link_attr) 'и я хочу реализовать этот метод в c. – xiefei