お題
- 次のような動作をするメソッド
my_collect
を定義せよ
a = [1,2,3,4,5] a.collect { |item| item * 2 }
条件
- Procを使うこと
- 引数としてeachメソッドを持つオブジェクトを受け取り、各要素をブロックで処理する
回答
def my_collect(obj, &block) ary = [] obj.each do |elem| ary << block.call(elem) end ary end a = [1,2,3,4,5] test_ary = my_collect(a) do |i| i * 2 end p test_ary => [2, 4, 6, 8, 10]
説明
Procは慣れるまでがややこしい。
def my_collect(obj, &block) ary = [] obj.each do |elem| ary << block.call(elem) end ary end
引数にobjと&blockを受け取る。objは、ここでは配列を受け取る前提。
受け取った配列をeachメソッドを使い、配列の中にある各要素をary配列に入れていく。その際はブロックに引き取った処理をおこなう。
a = [1,2,3,4,5] test_ary = my_collect(a) do |i| i * 2 end p test_ary
test_aryという変数を用意し、配列aの各要素を2倍にする。
mapメソッドを使ったほうがはるかにわかりやすいが、ここではProcの練習として。