Rubyブロックの定義方法

1349 ワード

Rubyブロックの定義方法
Rubyのdo ~endの間の部分をブロックと呼び、{..}と書くこともできます.次に、簡単な例を見て、どのようにブロックをカスタマイズする方法を見ます.
def myloop
    while true
        yield
    end
end
num = 1
myloop do 
    puts "num is #{num}"
    break if num > 100
    num *= 2
end

ここではyieldを用い,yieldはブロック付きメソッドを定義する際に重要なキーワードであり,yieldはメソッドを呼び出す際にブロックを介して渡される処理がyield定義の場所で実行されることを理解できる.上記の例ではyield部分にはパラメータがなく、パラメータがあればブロック変数としてブロックにパラメータが渡されます.次の例ではyieldに1つのパラメータを渡すと,1つのブロック変数が受け入れられる.0,1,3個のパラメータをyieldに渡すことで,対応するブロックをどのように処理するか.
def block_args_test
    yield() #0    
    yield(1) #1    
    yield(1, 2, 3) #3    
end
puts "  |a|     "
block_args_test do |a|
    p |a|
end
puts 

puts "  |a, b, c|     "
block_args_test do |a, b, c|
    p |a, b, c|
end
puts 

puts "  |*a|     "
block_args_test do |*a|
    p |*a|
end


出力結果:
  |a|     
[nil]
[1]
[1]

  |a, b, c|     
[nil, nil, nil]
[1, nil, nil]
[1, ,2, 3]

  |*a|     
[[]]
[[1]]
[[1, 2, 3]]

ブロックパラメータを渡してブロック値を取得する例をもう1つ挙げます
def total(from, to)
    result = 0
    from.upto(to) do |num|
        if block_given?
        result += yield(num)
        else 
        resunt += num
        end
    end
    return result
end

p total(1, 10)
p total(1, 10) {|num| num ** 2}