まつもと ゆきひろです
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 を参照して下さい.でも,
分かるかなあ.必要でしたら更に解説します.
まつもと ゆきひろ /:|)