Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

ブロック付きメソッド呼出し

ブロック付きメソッド呼び出しとは、メソッド呼び出しにブロックを結びつけることです。Rubyのブロック付きメソッド呼び出しによってできることの一つに、繰り返しがあります。ブロック付きメソッド呼び出しを使って繰り返しをおこなうために、あるオブジェクトの要素を順番に取り出してくれるメソッドが必要です。そのような「繰り返し系メソッド」の代表的なeachとtimesというメソッドを以下に説明します。

eachメソッド

オブジェクトの各要素に対してブロックを評価します。

<要素のあるオブジェクト>.<メソッド> do |<ブロックパラメータ>|
  <各要素におこないたい処理>
end

実際に実行した例が以下になります。

["Ruby", "HTML", "JavaScript", "Rails"].each do |output|
  p output.downcase
  p output
end

ある配列の要素として他の配列が幾つかネストされたもの(いわゆる二次元配列)にeachを呼び出すときは、ネストされた配列の要素ではなく、ネストされた配列自体が一個ずつ取り出されます。

下記の例には、要素は「,」で区切られたところまでを一度に渡します。

ary = [[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]]
ary.each do |i|
  p i[0], i[1], i[2]
end

アウトプット:

1
2
3
4
5
6
7
8
9
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ブロックパラメータの数を増やすことで、各ブロックパラメータが各要素に対応してくれます。

ary = [[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]]
ary.each do |a, b, c|
  p a, b, c
end

アウトプット:

1
2
3
4
5
6
7
8
9
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

配列オブジェクトから要素を取り出すのにeachメソッドを使いましたが、ハッシュオブジェクトでもeachメソッドは使えます。ハッシュオブジェクトはキーと値ごとにひとつの要素として扱います。そのため、eachメソッドでハッシュオブジェクトから取り出す要素はキーと値がひとつになったものです。

hash = {:foo => 1, :bar => 2, :baz => 3}
hash.each do |a|
  p a               
end

アウトプット

[:bar, 2]
[:foo, 1]
[:baz, 3]
=> {:bar=>2, :foo=>1, :baz=>3}

配列オブジェクトと同じようにブロックパラメータの数を増やすことで、キーと値のそれぞれに対応できます。

hash = {:foo => 1, :bar => 2, :baz => 3}
hash.each do |key, value|
  puts "key: #{key}, value: #{value}" 
end

アウトプット

key: bar, value: 2
key: foo, value: 1
key: baz, value: 3
=> {:bar=>2, :foo=>1, :baz=>3}

timesメソッド

予め繰り返し回数が分かっている場合は、timesメソッドを使った繰り返しをおこなうことができます。

<繰り返す回数>.times { ... }

実際に実行した例が以下になります。

sum = 0
10.times { sum += 1  }

for

forは要素の集まりからひとつずつ要素を取り出して、要素の数だけ繰り返します。

for <変数> in <式> do
  <本体>
end

実際に動かした例が以下になります。

ary = [1, 2, 3]
for i in ary
  p i
end

オブジェクトに範囲演算子を使うことで、その範囲の数値オブジェクトをひとつずつ取り出して操作することができます。

for i in 1..10
  puts(i)
end

eachメソッドも同じように要素の集まりからひとつずつ要素を取り出すことができました。forとeachメソッドの違いは、forは構文でeachはメソッドであることです。そのため、forの構文内で代入したローカル変数はforから抜け出したあとでも使うことができます。eachメソッドのブロック内で代入したローカル変数はeachメソッドから抜け出した後は使えません。このように変数の扱いが違います。

loopメソッド

無限に繰り返しを行いたい時はloopメソッドを使います。loopメソッドのブロック内に繰り返したい処理を書きます。

loop {
  <本体>
}

loopメソッドは中断する指示をしなければ無限ループになります。以下のように中断条件が成立した際にbreakメソッドを実行することで、処理を中断することができます。

count = 0
loop {
  if count == 3
    break
  end
  puts("ループしている")
  count += 1
}


次のコンテンツ ホームへ戻る