永井@知能.九工大です. >>>>> "F" == Tadayoshi Funaba <tadf / kt.rim.or.jp> writes: >> はい,そうだと思います.だからこそ,賛成したわけです.(^_^) F> そうすか。きっと反論されると思っていたのに、なにもなかったのでちょっと F> 拍子抜けして、思わず確認してしまいました :-) 期待を裏切ってしまい,すみませんでした.(^_^) >> ところでこういうのはいかがですか? F> 構造体ってメンバへのアクセスメソッドを定義してるってことなのかな。今は F> メンバのひとつをシンボルで参照するということもできないんじゃないかと思 F> うけど、どうなんでしょう、なかなか難しそうに思えますが。 そうですね.確かにこれはめちゃくちゃですね.(^_^; では,というわけで,こういうのはいかがでしょうか? Array#slice!(idx_list,[values]) Array#slice!(idx_list,[values]){|idx,val| ... } 配列 idx_list の各要素を index とする self の要素の並びを配列に して返す.生成される配列の要素順は idx_list の順に依存する. 配列 values が与えられたときは,idx_list と対応する配列要素を対 応する値で置き換える (不足分は nil になる). イテレータとして呼び出されたときは,values による置き換えの後, idx_list に対応する要素をイテレータを評価した結果で置き換える. (例) param=[2,1,4]; a = [-1,-2,-3,-4,-5] a.slice!(param,[0,0]) ==> [0, 0, nil] p a ==> [-1, 0, 0, -4, nil] a.slice!(param,[1,2,3]){|idx, val| print "arry[#{idx}] == #{val}\n"; val*2} ==> [2, 4, 6] (出力) arry[2] == 1 arry[1] == 2 arry[4] == 3 p a ==> [-1, 4, 2, -4, 6] Array#slice(idx_list) Array#slice(idx_list){|idx,val| ... } 配列 idx_list の各要素を index とする self の要素の並びを配列に して返す.生成される配列の要素順は idx_list の順に依存する. イテレータとして呼び出されたときは,idx_list に対応する要素につ いてイテレータを評価した結果を配列にして出力する. Hash#slice!(idx_list,[values]) Hash#slice!(idx_list,[values]){|idx,val| ... } Hash#slice(idx_list) Hash#slice(idx_list){|idx,val| ... } Array#slice に同様 (例) param=['foo','bar','baz'] a = {'asdf'=>-1, 'bar'=>-2, 'foo'=>-3, 'zxcv'=>-4, 'baz'=>-5} a.slice!(param,[0,0]) ==> [0,0,nil] p a ==> {"foo"=>0, "bar"=>0, "zxcv"=>-4, "asdf"=>-1} Struct#slice!(mem_list,[values]) Struct#slice!(mem_list,[values]){|mem,val| ... } Struct#slice(mem_list) Struct#slice(mem_list){|mem,val| ... } 第 1 引数がメンバ名の配列になることを除き,Array#slice に同様 (例) param=['foo','bar','baz'] sss = Struct.new('SSS',:asdf,:bar,:foo,:zxcv,:baz) a = sss.new(-1,-2,-3,-4,-5) a.slice!(param,[0,0]) ==> [0,0,nil] p a ==> #<Struct::SSS asdf=-1, bar=0, foo=0, zxcv=-4, baz=nil> ======================================================== class Array def slice! (sel_src,val_src=nil) sel = if sel_src then sel_src.dup else [] end val = if val_src then val_src.dup else nil end rval = [] if iterator? if val while (idx = sel.shift) rval.push(self[idx] = yield(idx, val.shift)) end else while (idx = sel.shift) rval.push(self[idx] = yield(idx, self[idx])) end end else if val while (idx = sel.shift) rval.push(self[idx] = val.shift) end else while (idx = sel.shift) rval.push(self[idx]) end end end rval end def slice (sel_src) sel = if sel_src then sel_src.dup else [] end rval = [] if iterator? while (idx = sel.shift) rval.push(yield(idx, self[idx])) end else while (idx = sel.shift) rval.push(self[idx]) end end rval end end class Hash def slice! (sel_src,val_src=nil) sel = if sel_src then sel_src.dup else [] end val = if val_src then val_src.dup else nil end rval = [] if iterator? if val while (idx = sel.shift) rval.push(self[idx] = yield(idx, val.shift)) end else while (idx = sel.shift) rval.push(self[idx] = yield(idx, self[idx])) end end else if val while (idx = sel.shift) rval.push(self[idx] = val.shift) end else while (idx = sel.shift) rval.push(self[idx]) end end end rval end def slice (sel_src) sel = if sel_src then sel_src.dup else [] end rval = [] if iterator? while (idx = sel.shift) rval.push(yield(idx, self[idx])) end else while (idx = sel.shift) rval.push(self[idx]) end end rval end end class Struct def slice! (sel_src,val_src=nil) sel = if sel_src then sel_src.dup else [] end val = if val_src then val_src.dup else nil end rval = [] if iterator? if val while (idx = sel.shift) rval.push(eval("self.#{idx} = yield(idx, val.shift)")) end else while (idx = sel.shift) rval.push(eval("self.#{idx} = yield(idx, self.#{idx})")) end end else if val while (idx = sel.shift) rval.push(eval("self.#{idx} = val.shift")) end else while (idx = sel.shift) rval.push(eval("self.#{idx}")) end end end rval end def slice (sel_src) sel = if sel_src then sel_src.dup else [] end rval = [] if iterator? while (idx = sel.shift) rval.push(yield(idx, eval("self.#{idx}"))) end else while (idx = sel.shift) rval.push(eval("self.#{idx}")) end end rval end end ======================================================== -- 永井 秀利 (九工大 知能情報) nagai / ai.kyutech.ac.jp