【问题标题】:rb_class_new_instance raises "ArgumentError: wrong type" - why?rb_class_new_instance 引发“ArgumentError:错误类型” - 为什么?
【发布时间】:2012-03-12 13:56:29
【问题描述】:

从我的 Ruby C 扩展中,我想从 Google SketchUp Ruby API 创建一个新的Geom::Vector3d 实例:https://developers.google.com/sketchup/docs/ourdoc/vector3d

我的初始代码是这样的:

static inline VALUE
vector_to_sketchup( Point3d vector )
{
  VALUE skp_vector, args[3];

  args[0] = rb_float_new( vector.x );
  args[1] = rb_float_new( vector.y );
  args[2] = rb_float_new( vector.z );

  skp_vector = rb_class_new_instance( 3, args, cVector3d );
}

然而这引发了一个错误:

Error: #<ArgumentError: wrong type - expected Sketchup::Vector3d>

相反,我不得不调用 ruby​​ new 方法 - 就像这样:

static inline VALUE
vector_to_sketchup( Point3d vector )
{
  VALUE skp_vector;

  skp_vector = rb_funcall( cVector3d, sNew, 3,
    rb_float_new( vector.x ),
    rb_float_new( vector.y ),
    rb_float_new( vector.z )
  );

  return skp_vector;
}

Geom::Point3dSketchup::Color 遇到了同样的问题。

rb_class_new_instance 是在 Ruby C 中创建新实例的首选方式,对吧? 有人知道为什么我需要打电话给new吗? SketchUp 中类的定义方式有些奇怪?

【问题讨论】:

    标签: c ruby-c-extension


    【解决方案1】:

    在与 Google SketchUp 的开发者沟通后,我找到了原因。

    SketchUp 使用Data_Wrap_Struct 将其 C 类与 Ruby 类链接起来。但是他们使用了一种旧方法来分配数据——在#new 方法中。

    在 Ruby 1.8 中,您使用 rb_define_alloc_func() 进行分配,而您永远不会乱用 #new。 Ruby(1.6 和 1.8)定义 #new 以调用 rb_class_new_instance()

    由于我在 SketchUp 的旧样式中使用rb_class_new_instance() 对未正确创建的对象进行分类,因此绕过了分配功能并且从未触发过。我得到的错误来自 SketchUp,而不是 Ruby。

    所以答案是,您可以使用rb_class_new_instance() 创建类的新实例,前提是它们没有重载#new 方法来进行任何初始化。在 Ruby 1.6 之前,如果 Ruby C 类需要分配数据,这很常见,但从 1.8 开始,它应该使用rb_define_alloc_func() 完成。 (Matz 在这里这么说:https://web.archive.org/web/20131003102349/http://www.justskins.com/forums/the-new-allocation-scheme-132572.html#post437362

    您可以在这篇文章中看到 Ruby 1.6 样式和 1.8 样式之间的区别:https://web.archive.org/web/20131003102349/http://www.justskins.com/forums/the-new-allocation-scheme-132572.html#post444948

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-30
      • 2021-04-21
      • 2021-10-17
      • 2011-01-19
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多