2004-09-06 [月]
_ [Ruby] 複数の配列に対してmapを行うには
配列の要素に対して何か処理を行う場合は、添字アクセスよりもArray#each、Array#mapメソッドを使うのがRubyっぽくてよい。例えばArray#map(各要素を順に評価し、結果を配列にして返すメソッド)はこのように使う。a = [1, 2, 3, 4, 5]
r = a.map{|e|
e * 5
}
p r #=> [5, 10, 15, 20, 25]
上記例では一つの配列の各要素を順に評価するだけであるため、非常にシンプルである。
では要素数が同一の複数の配列に対して、順に評価していくにはどうしたら良いだろうか。
a = [1, 2, 3, 4, 5]
b = [1, 2, 4, 8, 16]
r = []
a.size.times{|i| # aの要素数分(5回)繰り返す
r[i] = a[i] * b[i] # r.pushでも可
}
p r #=> [1, 4, 12, 32, 80]
これでもまあ良いのだけれど、各要素を順に評価して結果を返すという処理の流れからして、Array#mapにあたるものを使いたい。例えばArray#map_with_indexというメソッドがあったら・・・
a = [1, 2, 3, 4, 5]
b = [1, 2, 4, 8, 16]
r = a.map_with_index{|elem_a, i| # こんなメソッド存在しないけど
elem_a * b[i]
}
p r #=> [1, 4, 12, 32, 80] になったらいいなぁ^^;
こんなメソッドあったら便利そうだけど、実際はこんなメソッドは存在しない。
結局こんなコードを考えてみた。
a = [1, 2, 3, 4, 5]
b = [1, 2, 4, 8, 16]
r = [a, b].transpose.map{|e|
e[0] * e[1]
}
p r #=> [1, 4, 12, 32, 80]
ん、これで解決かな。hermes purse how much たわごと(2004-09-06)