Фактически я хочу знать, могу ли я, только используя библиотеку 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
, он просто дал мне узел, а затем заблокировал основной поток, чтобы я ничего не мог сделать; Я использовал это неправильно?
Благодарю!
Чтобы получить доступ к переменной $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"));
$LOAD_PATH
регистрируется сrb_define_hooked_variable
функцииrb_define_hooked_variable
, которая регистрирует метод получения. Когда вы используетеrb_gv_get
, вы уже используете правильную функцию получения.