从我的 Ruby C 扩展中,我想Geom::Vector3d
从 Google SketchUp Ruby API 创建一个新实例: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>
相反,我不得不调用 rubynew
方法——就像这样:
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::Point3d和Sketchup::Color上遇到了同样的问题。
rb_class_new_instance
是在 Ruby C 中创建新实例的首选方法,对吧?有人知道我为什么需要打电话new
吗?SketchUp 中类的定义方式有些奇怪?