tuedaの日記

2009-12-05

[][] (Cではなく)C++Rubyの拡張ライブラリを作るには

CでRubyの拡張ライブラリを作る方法はいくらでものっているのに、調べてもC++で作る方法が全然見つからなかったので自分で書く事にする。

ようはC++で定義したクラスとそのメンバー関数をRubyから使えるようにしたい。

  • 第1部は普通のグローバル関数をRubyから使えるようにする。
  • 第2部はクラスとそのメンバー関数をRubyから使えるようにする。
  • 第3部はrbplusplusを使って処理を自動化する

すべてのクラス、関数を手で書くと結構大変なので、実際には第3部で紹介する rbplusplus を使って自動で処理する事になると思うが、

そうは言っても中で何をやっているのか知っておかないと気持ち悪いので第1部、第2部も書いた。

自動処理のためのツールには他にもswigがあるが、今なら多分rbplusplusの方を使った方が良い。

mirichimirichi 2009/12/06 13:00 はじめまして、mirichiです。
rb++よさそうですね、ちょっと試してみようかと思います。

拡張ライブラリの作り方は情報自体がとても少ないので、何かと苦労しますよね。
GCまわりとか・・・。
で、気になったことをひとつ。
newメソッドは内部でinitializeを呼ぶので、再定義するとinitializeが使えなくなってしまいます。
newの動作はCのalloc_func呼び出し→Rubyのinitialize呼び出しとなっていますので、newは再定義せずに、
rb_define_alloc_func( class, alloc_func )
という関数を使ってインスタンスのメモリ確保関数を定義して、そこでメモリを確保して、
initializeを再定義してnewの引数を受け取って初期化、という流れになります。
こうするとRubyからinitializeを定義してsuperとかできるようになります。

tueda_wolftueda_wolf 2009/12/07 09:21 教えてもらったキーワードを元にググると、上の書き方ではダメですね。修正します。
ようやくわかってきました。

tueda_wolftueda_wolf 2009/12/07 13:55 修整しました。initializeまわりもOK.