Расширения на C в Ruby
НАВИГАЦИЯ ПО СТРАНИЦЕ
Ruby позволяет создавать расширения на C для повышения производительности или интеграции с существующими библиотеками на C.
Создание Ruby-расширений на C
Создание файла исходного кода
Создайте файл с исходным кодом на C для вашего расширения (например, my_extension.c).
// my_extension.c #include <ruby.h> VALUE my_extension_hello(VALUE self) { return rb_str_new2("Hello from my_extension!"); } void Init_my_extension() { VALUE MyExtensionModule = rb_define_module("MyExtension"); rb_define_method(MyExtensionModule, "hello", my_extension_hello, 0); }
Компиляция расширения
Компилируйте ваше расширение с использованием команды ruby extconf.rb для создания Makefile, а затем выполните make.
# Создание Makefile ruby extconf.rb # Компиляция make
Подключение расширения в Ruby
Подключите ваше расширение в Ruby-скрипте.
# main.rb require_relative 'my_extension' include MyExtension puts hello
Интеграция с библиотеками на C
Создание обертки для библиотеки
Создайте файл с исходным кодом, который оборачивает функциональность библиотеки на C (например, my_library_wrapper.c).
// my_library_wrapper.c #include <ruby.h> #include <my_library.h> // Подключение библиотеки на C VALUE my_library_wrapper_function(VALUE self) { // Вызов функций из библиотеки my_library_function(); return Qnil; } void Init_my_library_wrapper() { VALUE MyLibraryWrapperModule = rb_define_module("MyLibraryWrapper"); rb_define_method(MyLibraryWrapperModule, "call_function", my_library_wrapper_function, 0); }
Компиляция обертки
Компилируйте вашу обертку для библиотеки, аналогично созданию Ruby-расширения.
# Создание Makefile ruby extconf.rb # Компиляция make
Использование обертки в Ruby
Используйте обертку в Ruby-скрипте, чтобы вызывать функции из библиотеки на C.
# main.rb require_relative 'my_library_wrapper' include MyLibraryWrapper call_function
Создание расширений на C для Ruby позволяет использовать высокоэффективные библиотеки на C и повысить производительность вашего кода. Интеграция с библиотеками на C может быть осуществлена с помощью создания оберток, предоставляя Ruby-интерфейс для функциональности на C.