Ruby C扩展名:未定义时设置实例变量
如何在C扩展中实现以下Ruby习惯用法:Ruby C扩展名:未定义时设置实例变量,ruby,Ruby,如何在C扩展中实现以下Ruby习惯用法: class C def data @data ||= some_method(1,2,3) end end 我对编写Ruby扩展还不熟悉,基本上我正在试图弄清楚如果实例变量尚未设置,如何设置它。C扩展文件: /* C method implementation */ static VALUE rb_c_data(VALUE self) { VALUE data = rb_iv_get(self, "@data"); /* Get t
class C
def data
@data ||= some_method(1,2,3)
end
end
我对编写Ruby扩展还不熟悉,基本上我正在试图弄清楚如果实例变量尚未设置,如何设置它。C扩展文件:
/* C method implementation */
static VALUE
rb_c_data(VALUE self) {
VALUE data = rb_iv_get(self, "@data"); /* Get the @data value */
if(!RTEST(data)) { /* Check if @data is nil or false */
data = rb_funcall(self, rb_intern("some_method"), 3, INT2FIX(1), INT2FIX(2), INT2FIX(3));
rb_iv_set(self, "@data", data);
}
return data;
}
void
Init_myextensionname()
{
/* Create the class definition */
VALUE rb_cC = rb_define_class("C", rb_cObject);
/* Bind the C method */
rb_define_method(rb_cC, "data", rb_c_data, 0);
}
Ruby C类文件:
class C
def some_method *args
# whatever you want
puts args
42
end
end
你应该把这个再细分一点。您知道如何从C访问实例变量吗?您知道如何将其与
Qnil
进行比较吗?您知道如何设置实例变量吗?您知道如何从方法返回值吗?你试过什么?这不是你问题的答案,但是为什么你要用C扩展而不是使用?它会更便于携带,而且你也不必写Ci。不要认为这样的习语是可以转移的。在c扩展中,您编写c。这不是总体思路吗?