Just do IT

思うは招く

Procの参考問題 Ruby基礎#28

お題

  • 次のような動作をするメソッド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の練習として。