Как вызвать ObjectSpace.each_object с C API без rb_string_eval?
В настоящее время я пытаюсь получить все экземпляры класса, и я хотел использовать ObjectSpace.each_object
чтобы достичь этого.
Вот мой фактический код на C:
ruby_init();
int ruby_state = 0;
rb_string_eval_protect("def my_func ; ObjectSpace.each_object(Klass) { |x| x.do_something } ; end", &ruby_state);
ruby_cleanup(ruby_state);
Однако я не знаю, действительно ли это хорошо. Я хотел использовать rb_funcall
вместо этого, что может быть более чистый способ сделать это.
Мои вопросы:
- Это лучше использовать
rb_funcall
чемstring_eval
? (Я так думаю из-за парсера) - Как я могу получить
ObjectSpace
модуль в C API, так какrb_mObjectSpace
не существует?
1 ответ
Решение
Я нашел, как это сделать. Он использует rb_const_get
,
Вот код сейчас:
VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
Модуль уже был определен в gc.c
но не был публичным. Единственный способ получить доступ к модулю - это rb_const_get
(или изменить gc.c и собрать ruby, но никто не хочет этого делать).