Функция немного скрыта - мне пришлось копаться в источнике, чтобы найти ее, но вы можете использовать rb_const_get
, чтобы получить ссылки на существующие модули и классы.
void Init_foo() {
Foo = rb_const_get( rb_cObject, rb_intern("Foo");
Bar = rb_const_get( Foo, rb_intern("Bar");
rb_define_method(Bar, "print_string", print_string, 1);
}
Если вы хотите убедиться, что класс / модуль создан, если он не существует:
void Init_foo() {
if ( rb_const_defined( rb_cObject, rb_intern("Foo") ) )
Foo = rb_const_get( rb_cObject, rb_intern("Foo");
else
Foo = rb_define_module("Foo");
if ( rb_const_defined( Foo, rb_intern("Bar") ) )
Bar = rb_const_get( Foo, rb_intern("Bar");
else
Bar = rb_define_class_under(Foo, "Bar", rb_cObject);
rb_define_method(Bar, "print_string", print_string, 1);
}