Ruby внутри C добавляет к $ LOAD_PATH

0

Фактически я хочу знать, могу ли я, только используя библиотеку Ruby C, добавить к $ LOAD_PATH. Причина для этого заключается в том, что у меня есть письменное расширение (с использованием Rice, но это не очень важно), и я хотел бы, чтобы он был автономным с несколькими другими в своем собственном каталоге.

Теперь у меня уже есть два рабочих решения, с которыми я в порядке. Первое, что я просто использую Makefile, созданный Райсом, для автоматической установки общего объекта в стандартный каталог, который уже находится в $ LOAD_PATH. Супер легко без хлопот. Другая заключается в том, что я экспортирую $ RUBY_LIB в качестве каталога, который я хочу перед запуском, и время выполнения Ruby набирает на себя, как чемпион. Но я хочу знать, могу ли я сделать это только в C - для справки Я ищу функциональность, которая имитирует ruby -I./somedir

Прямо сейчас я инициализирую Ruby на C следующим образом, это отлично работает с ранее упомянутыми рабочими решениями, но я хочу, чтобы я смог добавить каталог в Ruby $ LOAD_PATH во время выполнения.

ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
....
rb_load_protect(...)
rb_funcall(...)

Я не мог понять, как работать с ruby_options, он просто дал мне узел, а затем заблокировал основной поток, чтобы я ничего не мог сделать; Я использовал это неправильно?

Благодарю!

Теги:
ruby-rice

1 ответ

1
Лучший ответ

Чтобы получить доступ к переменной $LOAD_PATH, используйте rb_gv_get("$LOAD_PATH") в вашем коде.

rb_gv_get("$LOAD_PATH") возвращает объект массива Ruby, поэтому можно использовать любую функцию массива C, например rb_ary_unshift, rb_ary_push и т.д.

Например:

VALUE load_path = rb_gv_get("$LOAD_PATH");
/* add a directory to Ruby $LOAD_PATH */
rb_ary_push(load_path, rb_str_new2("any expanded directory"));
  • 0
    Я думаю, что это лучшее решение, спасибо. Я бы хотел, чтобы для этого был метод верхнего уровня, но он работает именно так, как нужно.
  • 0
    @cleversoap Внутренне константа $LOAD_PATH регистрируется с rb_define_hooked_variable функции rb_define_hooked_variable , которая регистрирует метод получения. Когда вы используете rb_gv_get , вы уже используете правильную функцию получения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню