【发布时间】: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::Point3d 和 Sketchup::Color 遇到了同样的问题。
rb_class_new_instance 是在 Ruby C 中创建新实例的首选方式,对吧?
有人知道为什么我需要打电话给new吗? SketchUp 中类的定义方式有些奇怪?
【问题讨论】:
标签: c ruby-c-extension