『たのしいruby 第4版』第21章 Procクラス
第21章 Procクラス
模範解答はこちら
(1)
問題
Array#collect のような動作をする my_collect メソッドを定義しろ、という問題です。
私的解答
def my_collect(obj, &block) ary = [] obj.each do |i| ary << block.call(i) end ary end ary = my_collect([1, 2, 3, 4, 5]) do |i| i * 2 end p ary #=> [2, 4, 6, 8, 10]
引数で受けた配列を、 each メソッドで1つずつ引数で受けたブロックで処理します。
(2)
省略。
(3)
問題
実行するたびにそれまでに与えられた call メソッドの引数の合計を返す Proc オブジェクトを返す accumlator メソッドを定義しろ、という問題です。
私的解答
def accumlator total = 0 Proc.new do |i| total += i end end acc = accumlator p acc.call(1) #=> 1 p acc.call(2) #=> 3 p acc.call(3) #=> 6 p acc.call(4) #=> 10
Proc#call メソッドを呼び出した時の引数がブロック変数となるので、メソッド内で定義したローカル変数にどんどこ足せるように式を書けばおk。