0

私の 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>

代わりに、ルビー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 でどのように定義されたかについて、奇妙な点はありますか?

4

1 に答える 1

0

Google SketchUp の開発者と連絡を取り合った結果、この原因がわかりました。

SketchUp はData_Wrap_Struct、C クラスと Ruby クラスをリンクするために を利用しています。しかし、彼らはデータを割り当てる古い方法を使用しています - それは#newメソッド内にあります。

Ruby 1.8ではrb_define_alloc_func()、割り当てを行うために使用し、をいじることはありません#new。Ruby (1.6 および 1.8) では#new、 call が定義されていますrb_class_new_instance()

rb_class_new_instance()SketchUp の古いスタイルのクラスで適切に作成されていないオブジェクトを使用したため、割り当て関数がバイパスされ、トリガーされませんでした。私が得たエラーは、Ruby ではなく、SketchUp から来ました。

答えは、初期化を行うrb_class_new_instance()ためにメソッドをオーバーロードしていない限り、クラスの新しいインスタンスを作成するために使用できるということです。Ruby 1.6 より前では、Ruby C クラスでデータを割り当てる必要#newがある場合、これは一般的でしたが、1.8では. (マッツはここでそう言っています:https://web.archive.org/web/20131003102349/http://www.justskins.com/forums/the-new-allocation-scheme-132572.html#post437362rb_define_alloc_func()

Ruby 1.6 スタイルと 1.8 スタイルの違いについては、https: //web.archive.org/web/20131003102349/http ://www.justskins.com/forums/the-new-allocation-scheme- の投稿で確認できます。 132572.html#post444948

于 2012-03-30T16:05:56.260 に答える