ブロックの使い方を練習してみます。
def repeat(n) n.times { yield } if block_given? end repeat(2) { puts "Hello." } # Hello. # Hello.
メソッドに渡したブロックはyieldを用いて呼び出します。
似たような例としてもう一つ。
# nからmまでの自然数の合計を求める def sumup(n, m, sum=0) (n..m).each { |x| # yield でブロックを呼び出す yield if block_given? # 引数にブロックが与えられている puts x sum += x } puts "Sum : #{sum}" end sumup(2, 4) { printf "Add : " } #Add : 2 #Add : 3 #Add : 4 #Sum : 9
渡されたブロックはProcオブジェクトに変換されるのでcallを用いて呼び出すことも出来ます。下の例で確認してみます。
# nからmまでの自然数の合計を求める def sumup(n, m, &block) sum = 0 (n..m).each { |x| block.call if block # ブロックを呼び出し puts x sum += x } puts "Sum : #{sum}" end sumup(0, 4) { printf "Add : " } #Add : 0 #Add : 1 #Add : 2 #Add : 3 #Add : 4 #Sum : 10
最後に、渡されたブロックをまた引数として渡す場合の例を示します。
その際、ブロック変数名の前に「&」をつけます。
# 配列内の最小値を求める def minimum(arr, &block) block ? arr.select(&block).min : arr.min end arr = [20,48,15,67] p minimum(arr) {|i| i > 30} #=> 48