Итак, недавно мне посчастливилось сделать расширение C для Ruby (из-за производительности). Поскольку у меня были проблемы с пониманием VALUE
(и до сих пор), поэтому я заглянул в источник Ruby и нашел: typedef unsigned long VALUE;
(Ссылка на источник, но вы заметите, что есть еще несколько "способов", но я думаю, что это по существу long
, исправьте меня, если я ошибаюсь). Поэтому, исследуя это, я нашел интересное сообщение , в котором говорится:
"... в некоторых случаях объект VALUE мог бы быть данными вместо POINTING TO data."
Что меня смущает, когда я пытаюсь передать строку на 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*
] на inp):
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 на самом деле не лучшее, но это незавершенное производство; также прочитайте комментарии в фрагментах кода для некоторого дополнительного описания (если это помогает).
Спасибо!