【Ruby】繰り返し

「はじめてのRuby」を読んでのメモ。
今回は6章「繰り返し」



繰り返しのための構文とメソッドをまとめると、次の6つとなる。

  • times メソッド
  • for 文
  • while 文
  • until 文
  • each メソッド
  • loop メソッド



times メソッド

一定回数だけ同じ処理をさせるという繰り返し

7.times do
  puts "いちめんのなのはな"
end
#「いちめんのなのはな」を7回表示
7.times {
  puts "いちめんのなのはな"
}
# do ~ end の代わりに {} でも可
5.times do |i|
  puts "#{i}回目の繰り返しです"
end
#繰り返しの回数を知ることも出来る

繰り返しの回数は0から始まる点に注意。
また、 times メソッドでは変数に初期値を与えることが出来ない。

for 文
from = 5
to = 10
sum = 0
for i in from..to           #( do )
  sum = sum + i             # sum += i でも可
end
puts sum
#5から10までの整数の合計を表示

.. ( ... )は範囲オブジェクトを作るための記号。
上のような構文は特殊な形で、一般的には次のような構文になる。

for 変数 in オブジェクト ( do )
  繰り返したい処理
end
names = [ "Scala", "Perl", "Ruby" ]
for name in names
  puts name
end
#配列の要素を表示


while 文
sum = 0
i = 1
while sum < 50
  sum += i
  i += 1
end
puts sum

条件が成り立っている間、処理が実行される。

until 文
sum = 0
i = 1
while sum >= 50
  sum += i
  i += 1
end
puts sum

条件を満たしていない場合に、処理が実行される。

each メソッド

オブジェクトの集まりに対して、それを1つずつ取り出す時に使う。
for 文で行っていた処理によく似ていて、実際に for 文でのプログラムを each メソッドを使った形に直すことは容易である。

from = 5
to = 10
sum = 0
(from..to).each do |i|
  sum += i
end
puts sum
names = [ "Scala", "Perl", "Ruby" ]
names.each do |name|
  puts name
end


loop メソッド

終了条件のない、ただの繰り返しのためのメソッド。

loop do
  print "Ruby"
end
#実行非推奨

上のプログラムを実行すると、永遠に "Ruby" の文字が表示されてしまう。
このようなことにならないために、 loop メソッドでは break を使って繰り返しを途中で抜ける。

i = 0
loop do
  i += 1
  if i == 5
    break
  end
  puts 10
end


繰り返しの制御

先ほどの break のように、Ruby には繰り返しを制御する3つの命令がある。

  • break

繰り返しを中断し、繰り返しの中から抜ける。

i = 0
[ "Perl", "Python", "Scala", "Ruby"].each do |lang|
  i += 1
  if i == 3
     break
  end
  p [i, lang]
end

実行結果はこうなる。

[1, "Perl"]
[2, "Python"]


  • next

次の回の繰り返しに処理を移す。

i = 0
[ "Perl", "Python", "Scala", "Ruby"].each do |lang|
  i += 1
  if i == 3
    next
  end
  p [i, lang]
end

実行結果はこう。

[1, "Perl"]
[2, "Python"]
[4, "Ruby"]

i が3のときの処理がスキップされ、このような結果になる。

  • redo

同じ条件で繰り返しをやり直す。

i = 0
[ "Perl", "Python", "Scala", "Ruby"].each do |lang|
  i += 1
  if i == 3
    redo
  end
  p [i, lang]
end

実行結果。

[1, "Perl"]
[2, "Python"]
[4, "Scala"]
[5, "Ruby"]

redo は、使い方を間違えると、まったく同じ条件のまま、ひたすら同じ処理を繰り返すことになってしまうので、使うときは注意が必要です。

redo 、あまり使う機会は無さそう・・・?