さとうふみやす @ OSSTech です。

At Tue, 09 Oct 2012 10:41:58 +0900,
Inaba,Touru wrote:
> rb_define_class_under(mSomeModule, "SomeClass", rb_cData) 
> 
> のように定義したとします。
> 通常はRubyのほうで
> 
> a = SomeClass.new
> 
> のように使うのですが、拡張モジュールで定義しているメソッドが 
> SomeClassのインスタンスを生成して返すようにしたい場合、
> Cではどのように書けばいいのでしょうか?
> つまり、Cのほうでnewをやって、それをRuby側に返したいということです。

rb_class_new_instance() を使ってインスタンス生成できます。
第一引数はコンストラクターに渡す引数の数、第二引数は
コンストラクターに渡す引数の VALUE の配列、第三引数は
rb_define_class_under() の戻り値です。

コンストラクターの引数が 2つの場合:

  VALUE args[2];

  args[0] = foo_obj;
  args[1] = bar_obj;
  someclass_obj = rb_class_new_instance(2, args, rb_cSomeClass);

  return someclass_obj;

Ruby ソースツリーの ext/**/*.c がある程度参考になるかと。

-- 
-- Name: SATOH Fumiyasu (fumiyas @ osstech co jp)
-- Business Home: http://www.OSSTech.co.jp/
-- GitHub Home: https://GitHub.com/fumiyas/