From: Masao M. <mu...@hi...> - 2006-05-09 18:12:49
|
むとうです。 On Tue, 09 May 2006 23:07:15 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > rbgobj_object.cのtype_registerの中で,RubyGObjectHookModule > を作って,そのinitialieをgobj_initializeにしていますが,これ > だと以下のような場合に少し予想外の動作をします. > > > class TestLabel < Gtk::Label > type_register > end > > Gtk::Label.new("label") # OK > TestLabel.new("label") > # => `initialize': wrong argument type String (expected Hash) (TypeError) > > > こうしているのにはなにか理由があるのだと思いますが,パッと見 > た感じではわかりませんでした. あぁ、これは、type_registerを呼んだときはデフォルトで TestLabel.new(:label => "label") のように呼ぶようにする必要があるんですよね。 > RubyGObjectHookModule#initializeを定義しないと,上記の > TestLabel.new("label")でも動くような気がしますが,試してはい > ません. 確かそのままでは動かなかったと思います。 というのは、TestLabel.newしたときのinitializeメソッドが、実は Gtk::Labelのinitializeメソッドだとすると、そのときのGTypeはGtk::Label のそれになり、TestLabelのGTypeが使われなくなってしまうからです。 そうなるとsignalを追加しようとしたときにTestLabelに追加したつもりが実は Gtk::Labelに追加されていた、なんてことになり、都合が悪かったと思います。 #sample/type_register(2).rbを参考にいじってみるとすぐ問題がわかると思います。 わかりづらい、というのは同意しますし、この辺、実はまだうまく練られていなくて Rubyっぽくない最たる部分の一つだとは思っていますが、うまい解決策が思いつかないので そのまま長いこと放置してしまっているんですよね。何か改善案があれば歓迎です。 それでは。 -- .:% Masao Mutoh<mu...@hi...> |