Итак, недавно у меня возникла досадная необходимость сделать расширение C для Ruby (из-за производительности). Поскольку у меня были проблемы с пониманием VALUE
(и все еще есть), поэтому я заглянул в исходный код Ruby и обнаружил: typedef unsigned long VALUE;
( Ссылка на источник ], но вы заметите, что есть несколько других «способов», но я думаю, что это, по сути, long
; поправьте меня, если я ошибаюсь). Итак, исследуя это дальше, я обнаружил интересную запись в блоге , в которой говорится:
«... в некоторых случаях объект VALUE может БЫТЬ данными вместо УКАЗАНИЯ НА данные»
. Меня смущает то, что когда я пытаюсь передать строку в C из Ruby и использую RSTRING_PTR ();
для VALUE
(передано в C-функцию из Ruby), и попробуйте «отладить» его с помощью strlen ();
он возвращает 4. Всегда 4.
пример кода:
VALUE test(VALUE inp) {
unsigned char* c = RSTRING_PTR(inp);
//return rb_str_new2(c); //this returns some random gibberish
return INT2FIX(strlen(c));
}
В этом примере всегда возвращается 1 в качестве длины строки:
VALUE test(VALUE inp) {
unsigned char* c = (unsigned char*) inp;
//return rb_str_new2(c); // Always "\x03" in Ruby.
return INT2FIX(strlen(c));
}
Иногда в Ruby я вижу исключение с сообщением «Невозможно преобразовать модуль в строку» (или что-то в этом роде, , однако я так сильно возился с кодом, пытаясь понять это, что не могу воспроизвести ошибка сейчас ошибка может произойти, когда я попробую StringValuePtr ();
[Я немного не понимаю, что именно это делает. В документации говорится, что он изменяет переданный параметр на char *
] на i np):
VALUE test(VALUE inp) {
StringValuePtr(inp);
return rb_str_new2((char*)inp); //Without the cast, I would get compiler warnings
}
Итак, рассматриваемый код Ruby: MyMod :: test ("blahblablah")
EDIT : исправлено несколько опечаток и немного обновлено сообщение.
VALUE imp
? Указатель на объект / значение?
Само значение? P.S: Я не очень хорошо понимаю C, но работа над ним еще не завершена; кроме того, прочтите комментарии во фрагментах кода, чтобы получить дополнительное описание (если это поможет).
Спасибо!