一度も読み通していなかったので、読み返す。だいぶ理解できるようになっている。よかった。
##ブロックについて
arrays = [1, 2, 3, 4] hoge = [] arrays.each do |n| hoge << n * 2 if n % 2 == 0 end hoge #=> [4, 8]
ブロックはメソッドの引数として渡すことのできる処理のかたまりです。ブロック内で記述した処理は必要に応じてメソッドから呼び出される。
なのでこの場合、eachメソッドにブロック(do - endの部分)を渡しているということになる。 eachは配列の要素を順番に取り出し、ブロックパラメーター(n)に渡す。取り出した要素をどう扱うのかはブロックに記述することができる。 偶数であれば、二倍にしてhoge配列に加える、という処理をブロックに書くことができ、配列のそれぞれをその条件文に通すことができるというわけだ。
##with_index便利そう
each_with_indexは0からだけど、with_indexなら開始番号を任意に決められる。
irb(main):004:0> int = [1,2,3,4] irb(main):005:1* int.each.with_index(1) do |n, i| irb(main):006:1* p "#{i}番目は#{n}です" irb(main):007:0> end "1番目は1です" "2番目は2です" "3番目は3です" "4番目は4です"
## Enumerableモジュール
ArrayもRangeもEnumeratorもEnumerableモジュールをincludeしているので、Enumerableモジュールのメソッドが利用できる。 Ruby逆引きハンドブックによれば、「Enumerable」は配列を一般化したもの、らしい。