rb_iv_get
и rb_iv_set
VS. Data_Wrap_Struct
для пользовательских calsses
Итак, читая API расширения Ruby, я обнаружил Data_Wrap_Struct
, который преобразует указатель в объект Ruby (верно?). Тем не менее, когда я пытался использовать это, я продолжал получать случайные ошибки и еще много чего, поэтому я как бы переключался на что-то вроде:
void Init_custom() {
//cCustom declared as VALUE higher in the code
cCustom = rb_define_class("Custom", T_OBJECT);
rb_define_method(mTester, "initialize", init_Custom, 1);
rb_define_method(mTester, "someValue", someValue_get_Custom, 0);
rb_define_method(mTester, "someValue=", someValue_set_Custom, 1);
//And so on.
}
Во-вторых, someValue_get_Custom
и someValue_set_Custom
будут:
VALUE someValue_get_Custom(VALUE self) {
return rb_iv_get(self, "@someValue")
}
VALUE someValue_set_Custom(VALUE self, VALUE val) {
return rb_iv_set(self, "@someValue", val) //or do I have to do return val;?
}
Другой вариант - создать версию C на 1015 *, которая сделает код немного короче и DRYer, но он все равно будет частью плана B (с использованием rb_iv_
set
/ get
).
Теперь мне бы очень хотелось выяснить, как использовать Data_Wrap_Struct
, поскольку у меня есть подозрения, что это может быть быстрее, чем при использовании rb_iv_set
и rb_iv_get
, но если это не то, что я думаю, тогда я Придется прибегнуть к плану Б.
Итак, я думаю, реальный вопрос:
Что точно делает Data_Wrap_Struct
и как его правильно использовать или just
использует без ошибок .
О, и я почти забыл, еще несколько вопросов, связанных с Data_Wrap_Struct
:
Что именно делает параметр mark (функция)? В нем говорится, что для параметра mark нужно установить значение 0, если на объект нигде не ссылаются, но что, если на него ссылаются где-то (возможно, RArray)?
Во-вторых, будет ли свободный параметр (также функция) простой функцией, которая освобождает выделенную память для этого объекта?
И что-нибудь передается этим двум функциям сборщиком мусора, может быть, VALUE self
?
Спасибо!