越水です。

ruby-talkも拡張ライブラリの話で盛り上がっていますが・・・

ところで、拡張ライブラリの作成について質問がいくつかあります。

まず、Cコードで`require'したいのですが、それらしき関数を見つけることが
できませんでした。そこで、Init_XXX()で:

  rb_eval_string("require 'foo'");

とやりました。

次に、Cコードで、built-inでないクラスからインスタンスを作ろうと思い、
ruby.hを調べました。NEWOBJとOBJSETUPが見つかったのですが、使い方が理解
できず、結局:

  rb_eval_string("Foo.new");

とやりました。

さらに、Cコードでの例外についてです。built-inでない例外クラスをraiseし
たいのですが、rb_raiseは、例外クラスのVALUEを必要とします。そこで:

  rb_raise(rb_eval_string("MyException"), "exception occured");

とやりました。

このように、rb_eval_string()が大活躍しているのですが、効率がちょっと心
配です。もっと賢いやり方があるのでしょうか?

最後に、CコードのメソッドとRubyコードのメソッドを合わせ持った1つのク
ラスを作ることは許されないのでしょうか? イメージとしては、Javaのネイ
ティブ_メソッドのような感じです。Cで作ったモジュールをRubyのクラスで
includeすれば可能なのでしょうけども。

越水
greentea / fa2.so-net.ne.jp