From: Kouhei S. <ko...@co...> - 2004-10-17 11:01:45
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] Maintainer wanted" on Sun, 17 Oct 2004 18:48:54 +0900, Masao Mutoh <mu...@hi...> wrote: > > A, Bというクラスがあったとして, > > > > B.new # -> instance of A > > > > ということがしたいので,#initializeだと無理だと思います. > > > > class A; end > > class B > > def self.new > > A.new > > end > > end > > > > class C > > def initialize > > A.new > > end > > end > > > > p B.new # -> A > > p C.new # -> C > > 上記のご説明いただいた内容からしますと、 > B.new #=> Aということ自体、直感的でないような気がします。 > B.newで返すインスタンスはBであるべきでは?ということです。 > 逆に、同様のことをしたいのでしたらメソッド名を変えるとかの方が > 良いような気がします。 > たとえば、B.create_factoryとか。 うぅ,例が悪かったです. # こっちの方が意図が伝わるかと思ったのですが,失敗でした. 確かに,PrintConfig.newはPrintConfigオブジェクトを返すのです が,返したいオブジェクトはClass#new(Class.new???)でアロケー トしたPrintConfigオブジェクトではないのです(B.new #=> Aはそ こらへんをいいたかったらしい).具体的には gnome_print_config_from_string()でアロケートされた GnomePrintConifgです. > でも、私が指摘した点はもっと単純で、Rubyとlibgnomeprintの > ライブラリの対応関係を考えて > gnome_print_config_default/_from_stringの実装を見ると、 > どちらも、GNOME_TYPE_PRINT_CONFIGのインスタンスを作っているので > B.new #=> AではなくB.new #=> Bでは無いでしょうか(つまり、Ruby側 > から見るとそれはやはりGnomePrintConfigのインスタンスなのではないかなと) > と言う前提の元、それならば#initializeを実装すべきでは?ということでした。 > #何か勘違いしてるのかな...。 #initializeでごにょごにょやろうとしても,#initializeではもう すでにClass#newとかでGnomePrintConfigがアロケートされてしまっ ています.この時点ではもう遅いのです. 私の考えは以下のような感じです. PrintConfig#initializeでやる場合 PrintConfig.newすると... (1) どこかでGnomePrintConfigをアロケートする. (2) アロケートしたオブジェクトを#initializeで初期化する. #initializeでgnome_print_from_string()でアロケートした GnomePrintCofnigを返しても,PrintConfig.newが返すのは Class#newとかがアロケートしたGnomePrintConfig. →だから今回は使えなそう. PrintConfig.newでやる場合 PrintConfig.newすると... (1) gnome_print_from_string()でGnomePrintConfigをアロケー トし,それを返す. →だから今回はこっちの方がよさそう. rubyのレベルでいうと, class A attr_accessor :a @@obj = A.new def self.a_is_one @@obj.a = 1 @@obj end end class B < A def self.new a_is_one end end class C < A def initialize self.class.a_is_one end end p B.new.a # => 1 p C.new.a # => nil というようになるのですが,私の意図は汲み取って頂けるでしょう か. > 賛成です。ただ、それであれば、PrintConfig.defaultの機能をPrintConfig.new > から省くべきではないでしょうか。 そうですね. そうします. > > > * Gnome::PrintPaperの実装ですが、わざわざGnome::PrintPaper::Paperを > > > 用意した意図がちょっとわからないのですが...。 > > > > rubyのレベルでいうと > > > > A = Struct.new(:a, :b, :c) > > > > と > > > > A = Struct.new("A", :a, :b, :c) > > > > の違いで,今回は後者を使っていたので,A::Aがあるという話です > > よね? > > いやいや、単純にGnomePrintPaperという構造体をラップするのに、 > Gnome::PrintPaper::Paperは不要(というか冗長)なのではないかな、 > ということです。 ん? A = Struct.new(:a) p A.constants # => ["Tms"] B = Struct.new("B", :a) p B.constants # => ["B", "Tms"] p B.id # => 540681504 p B::B.id # => 540681504 ということと同じですよね? # 今回の場合は私のミスでGnome::PrintPaperと # ^^^^^^^^^^ # Gnome::PrintPaper::Paperというように定数名が異なっていますが. # ^^^^^ つまり,Gnome::PrintPaperとGnome::PrintPaper::Paperは同じも のだから問題ないですよね?ということが言いたかっただけです. > そうですねぇ。10月末くらいを目処に一度リリースするというのは > どうでしょうか? そのくらいあれば大丈夫だと思います. > #もっと早いほうが良いですか? いえいえ,そんなことはないです. :-) |