Из моего расширения Ruby C я хотел создать новый экземпляр Geom::Vector3d
из API Google SketchUp Ruby: 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 );
}
Thisоднако возникла ошибка:
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?