From: shukaku@... Date: 2002-03-22T20:09:02+09:00 Subject: [ruby-list:34588] Re: cgi.rb+ イテレータ At Fri, 22 Mar 2002 19:38:32 +0900, FUJIOKA Takeyuki wrote: > # イテレータへ添字も値もさばきたいです。かえって長くなるかな? mapじゃ無理ですよねぇ。each_with_indexを使うと結果を配列で得られないの で、文字列に追加していって反復後に値を参照するという方針で書いてみまし た。変数の初期化と参照で2行増えました。 data=%w{福島 宮城 山形} @cgi.out{ options = "" data.each_with_index{|name,index| options << @cgi.option("VALUE"=>index.to_s){name}+"\n" } options } あとは本末転倒(?)なコードも。Array#indexを使う場面じゃないとは思うんで すが、こんな方法もあるかな、ってことで。 # これこそ無駄ですね。 data=%w{福島 宮城 山形} @cgi.out{ data.map{|name| @cgi.option("VALUE"=>data.index(name).to_s){name}+"\n" } } もう一つ、Rubyの特徴を利用して、Array#map_with_indexを定義してみました。 メソッド定義する分だけ行数は増えますが、再利用には便利。(^_^) class Array def map_with_index result = [] each_with_index do | value, index | result << yield( value, index ) end return result end end data=%w{福島 宮城 山形} @cgi.out{ data.map_with_index{|name,index| @cgi.option("VALUE"=>index.to_s){name}+"\n" } } # 分かりやすさ重視で、実行速度やメモリ効率は考慮してません...。^^; ///// ------------------------------------------------------------------ -O-O- 斉藤 秀格 (SAITO Shukaku) @ PUGH (Palm Users Group in Hokkaido) _ master@shukaku.nu (ぱふ) http://www.pugh.palm-j.com/