gotagota日記

「面白きことは良きことなり」

『たのしい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。