まつもと ゆきひろです

In message "[ruby-list:9018] making extension module"
    on 98/08/11, "民斗 " <tommy / valley.ne.jp> writes:

|民斗です。
|
|MySQL というデータベースを Ruby からアクセスできるようにしようと
|思って、C で拡張モジュールを書いてみました。

実は昨日そのページを読んでいたのでした.
# We are watching you.

|1. 関数によっては、C で記述する必要のないものがあるので、クラス中の
|   一部の関数を Ruby で書きたいのですが、同一のクラスを関数によって 
|   C で記述したり、Ruby で記述したりできるのでしょうか。

できますよん.Rubyはいいかげんな言語で同じクラスを何度も定義
できるんです(2度目以降は定義の追加).ですから,まずCでMySql
というクラスを定義して,残りは追加するというのでどうでしょう.

さらに require は .rb を先に探す事を利用して,

mysql.rb:
  require 'mysql.o'     # Cで書かれたモジュールをロード
                        # この中でMySQLクラスを定義

  class MySQL           # Rubyレベルで再定義
    #...
  end

というRubyによるラッパーも簡単に書けます.RubyのC APIはRuby
で出来ることはCからも割と簡単にできるようになっていますが(こ
の辺がPythonと違う),それでも適材適所で,Rubyで書いた方が楽
なものは上のような方法でRubyで書いた方が良いかもしれません.

なお,上記の require 'mysql.o' ですが,同名のライブラリのう
ち拡張モジュールを明示的に呼び出す指定で,これはDLLの拡張子
に関係なくいつでも拡張子として .o を指定して下さい..so は特
別扱いしません.

|2. C++ のデストラクタのようなものは Ruby ではどのように書くのでしょうか。
|   C での拡張モジュール中では、Data_Make_Struct() の第4引数で関数を指定
|   できるようですが、Ruby で作成したクラスの場合、どのように書くのか
|   わかりませんでした。

RubyレベルではGCがあるので,明示的にオブジェクトを破棄する必
要はあまりないはずです.どーしても,GCのタイミングでなんらか
の処理が行いたい場合には lib/final.rb を使うワザはありますけ
どね.実例としては lib/tempfile.rb を参照して下さい.でも,
分かるかなあ.必要でしたら更に解説します.

                                まつもと ゆきひろ /:|)