Передача C-инициализированной структуры встроенному интерпретатору Ruby

Я встраиваю Ruby в C, и мне нужно передать структуру, созданную в C, в сценарий Ruby, где я хочу работать со значениями структуры. Я успешно сделал это с объявлением структуры rb_struct_define и инициализацией rb_struct_new, но я не могу передать структуру, определенную в стиле C (struct Address {...}).

Мне посоветовали, что это можно сделать с помощью Data_Wrap_struct, но я не могу заставить его работать.

Мой пример кода находится здесь: https://gist.github.com/1641269


person matejuh    schedule 19.01.2012    source источник


Ответы (1)


Все, что вы передаете методу Ruby, должно быть объектом Ruby, вы не можете напрямую передать объект структуры C.

Что вы можете сделать, так это создать объект-оболочку для вашей структуры, который предоставит коду Ruby доступ к своим членам. К сожалению, насколько мне известно, нет возможности сделать это автоматически на основе членов структуры. Вам придется написать код C, чтобы определить соответствующие методы, что может стать немного утомительным, если ваша структура имеет много элементов.

Макрос Data_Wrap_Struct используется для переноса структуры C в объект Ruby. Затем вы можете использовать Data_Get_Struct в реализациях методов, чтобы развернуть структуру и получить данные.

Вот пример, который, надеюсь, укажет вам правильное направление.

person matt    schedule 19.01.2012
comment
Большое спасибо, ваш пример идеален и определенно указывает мне правильное направление. Я искал что-то подобное в течение нескольких часов. - person matejuh; 20.01.2012