ブロック引数
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 18/56。
パイプ記号(|)で囲まれた変数 |x|、|x, y| は、ブロックパラメータです。これらは、メソッドがブロックに渡す値に名前を付けます。
メソッドによって、1つの値を渡すものもあれば、複数の値を渡すものもあります。each は一度に1つの要素を渡します:
[10, 20, 30].each { |n| puts n }each_with_indexは、要素とそのインデックスの2つを渡します:
["a", "b", "c"].each_with_index do |letter, i|
puts "#{i}: #{letter}"
end
# 0: a
# 1: b
# 2: cハッシュをイテレートする場合、ブロックパラメータはキーと値になります:
{ a: 1, b: 2 }.each do |key, value|
puts "#{key} = #{value}"
endブロックパラメータの数と順序は、メソッドが何を yield するかによって決まります。迷ったときは、ドキュメントを確認するか、パラメータを1つ試してみて何が得られるかを確認してください。
チャレンジ
簡単ハッシュscoresが与えられています。to_a形式に対してeach_with_indexを使用して反復処理を行い、(name, points)のペアとその位置の両方にアクセスできるようにします。各エントリを次の形式で1行ずつ出力してください:
<rank>. <name> - <points>ここで、rankは(0ではなく)1から始まります。
デフォルトのハッシュの場合、出力は次のようになります:
1. Alice - 90
2. Bob - 85
3. Cara - 78チートシート
ブロックパラメータはパイプ |...| の間に記述され、メソッドから渡された値を受け取ります:
# each – 1つのパラメータ
[10, 20, 30].each { |n| puts n }
# each_with_index – 要素とインデックス
["a", "b", "c"].each_with_index do |letter, i|
puts "#{i}: #{letter}"
end
# hash each – キーと値
{ a: 1, b: 2 }.each do |key, value|
puts "#{key} = #{value}"
endhash.to_a はハッシュを [key, value] のペアの配列に変換します。これは each_with_index と一緒に使うと便利です:
{ a: 1, b: 2 }.to_a.each_with_index do |(key, value), i|
puts "#{i}: #{key} = #{value}"
end自分で試してみよう
scores = { "Alice" => 90, "Bob" => 85, "Cara" => 78 }
# TODO: 各エントリに対して "<rank>. <name> - <points>" を出力する。ランクは1から開始する。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。