2012-09-29 2 views
0

Я пытаюсь передать 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?

ответ

0

Ответ нет. Я думаю, что вы неправильно понимаете суть FFI, или я не понимаю ваш пост. Если вы переносите свое родное расширение на FFI, это должно означать, что вы избавляетесь от всего кода C в базе кода и конвертируете его в Ruby. Вы должны преобразовать функции старых методов C rinku_autolink() и rb_rinku_autolink() в Ruby, возможно, один метод Ruby. Затем, если этот метод Ruby должен вызвать некоторые функции C, вы должны использовать метод FFI attach_function, чтобы получить доступ к ним.

Если это не то, что вы делаете, не могли бы вы объяснить, какова ваша фактическая цель и почему?

+0

Я предполагаю, что вы имеете в виду, что я должен определить новую функцию c с именем «auto_link», которая выполняет работу orignal «rinku_autolink», и эта функция должна иметь те же аргументы, что и интерфейс ruby. Затем, как выразить аргументы по умолчанию в этой c-функции? – xiefei

+0

Что вы пытаетесь сделать? –

+0

Мне нужен рубиновый метод '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

Смежные вопросы