From: keiju@... (Keiju ISHITSUKA) Date: 1997-09-24T13:00:58+09:00 Subject: [ruby-list:4568] Re: initialize structure array [Re: class variable] けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :04458 ] the message: "[ruby-list:4458] Re: class variable ", on Sep/19 20:50(JST) toyofuku@juice.or.jp writes: > 豊福@パパイヤです。 >見てたはずですがすっかり忘れてました。 >でもメンバ名が動的に決まるようなとき以外は Struct >を使うよりクラスを直接定義した方が読みやすそうですが >どんな使い道に Struct は有効なんでしょうか。 クラスとして実装するにはそれなりのメソッドを用意してあげないといけない ですよね? 中には, 属性のアクセスだけできれば良い場合も多いと思います. 例えば, rubyでStructを使っている例は, Etc.getpwname(name) などです. こ れなんかは, 持ってきたpasswd情報を配列じゃなくて名前で参照できることに なります. あと, 実はStructもメソッドが定義できるので, クラスとの違いは, 最初から 属性名を決める(なくてはならない|ことができる)ことと, 内部の実装が違う ことではないでしょうか? 例: Date = Struct.new("Date", :year, :month, :day, :hour, :minit, :second) class Date def yy year end alias mm month end d = Date.new(1997,10,11,12,12,12) print d.mm > 今回の一次元配列のケースだけだとそれでもよいのですが、 > foo = [[[1,2],[2,3]], [[3,4],[4,5]]] > foo[0][1].x >や > foo = {"a" -> [1,2], "b" -> [3, 4]} などの > foo["b"].y >みたいな多次元配列、ハッシュなどあらゆる形の初期化に >簡単に対応できませんよね。 うーん. なるほど, 言わんとしていることが理解できていなかったみたいです ね(^^;;; ちょっと分かりづらいかも知れませんが, 簡単に書くというだけであれば: ary = [[1,2], [2,3]].collect{|x, y| Coord(x, y)} という手があります. でも, ハッシュの場合はcollectが使えない(使えるが配列が帰 る)ので, ary = {"a" -> [1,2], "b" -> [3, 4]} for key, value in ary ary[key] = Coord(value[0], value[1]) end ってなってしまいますね. 結局, 配列(ハッシュ)に複数の要素を初期化パラメータだけあたえて, それら によって初期化されたインスタンスの配列(ハッシュ)ができるようなAPIがあ れば良いんですよね? そのような機能であれば存在する理由は十分にあると思うので, リクエストし ちゃえば良いんじゃないでしょうか? APIの案としては, いろいろあると思うのですが, 1. Array.vnew(elm_class, method, elm_init_list) 2. Array.vnew(elm_class, method, elm_init1, ...) 3. Array.vnew(elm_init_list, elm_class, method = "new") あと, iterator/procを使うAPIも考えられるかな? 4. Array.vnew(elm_init_list) {|init| AClass.foo(*init)} でも, これだと, Array#collectとほとんど同じだから嬉しくないなあ... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---