From: Kouhei S. <ko...@co...> - 2009-02-27 11:40:14
|
須藤です。 In <200...@me...> "[ruby-gnome2-devel-ja] GooCanvas - method overriding" on Wed, 25 Feb 2009 16:54:23 +0900, Kentaro Fukuchi <fu...@me...> wrote: > 現状の GooCanvas では Goo::CanvasItem の subclass で update などのメソッドを > Ruby 側で override しても意味がないのをどうにかしようと、PyGooCanvas を眺め > ています。 Ruby/GooCanvasはまだまだやることがたくさんあるんですよ ねぇ。。。 > Python バインディングでは PyGObject が GObject のバインディングにまつわる > 諸々の面倒を見てくれるようで、コードを書くのは楽になっているようですが追う > のは大変。codegen が生成したコードを眺めてやっと理解できましたが、 > __GooCanvasItem__interface_init() という関数が CanvasItem のインスタンス生成 > をやっていて、その中でインスタンスの update を、_wrap_GooCAnvasItem__proxy_do_update > に置き換えるということをしています。このラッパー関数の中で、do_update メソッド > (どういう理由か、"update" 名前じゃ駄目らしい) が定義されていたらそっちを呼ぶ、という > 仕掛けになっています。 あぁ、インターフェイスだと、メソッド用関数ポインタにそれぞれ にCの関数を登録しなきゃいけないですね。シグナルだと動的にで きるのですが、これだとコンパイル時に作らないといけませんね。 うーん。 > というのがサーベイ結果です。同様の仕組みは Ruby でも実現できそうなので、ちょっと > 実験してみようと思います。 そうですね。たぶんできると思います。 シグナルみたいに何もしなくても勝手に動くような仕組みが作れる といいんですけど、動的にGTypeIntefaceが持っているメソッドの 情報がとれないので無理かしら。。。 > ところで、前述のように PyGObject ではバインディングを記述するための様々な > ツールを提供していますが、同様の試みは Ruby-gnome2 ではありますでしょうか。 > 一応こんなの > http://trac.novowork.com/rbgtool/wiki > は見付けましたが、メンテナンスされていないですね…。 ないです。 今からやるのであればGObject Introspectionベースにするのがい いと思います。 http://live.gnome.org/GObjectIntrospection/ たしか、Cパーサも持っていましたし。いや、CパーサはValaが持っ ていたのかしら。うろ覚えです。いつかちゃんと見たいなぁと思っ ているのですが、余裕がなくて。。。 そういえば、誰か、微妙にRubyでやっている人がいたような気が。 |