Ruby C扩展名:未定义时设置实例变量

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

如何在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 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。这不是总体思路吗?