ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

Ruby - 繰り返しいろいろ

おもな繰り返し構文・メソッド

times

繰り返したい処理の回数が既に決まっている場合に使用すべきメソッド

基本構文

繰り返し回数.times do
    処理
end

また、doを省略して{}で囲ってあげる書き方も可能。これは、eachも同じですね。

繰り返し回数.times {
    処理
}

timesの処理の中で、何度目の処理かを知るためには、以下のように書けば、指定した変数に繰り返し回数が数値で参照できるようになる。

繰り返し回数.times do |変数| 
    処理
end

具体的に書くと、以下の様なかたち。

5.times do |i|
    puts "#{i}:進捗どうですか"
end
0:進捗どうですか
1:進捗どうですか
2:進捗どうですか
3:進捗どうですか
4:進捗どうですか

for文

特徴的な点としては、範囲オブジェクトを使用する(in 開始時数値..終了時数値がそれ)と開始時の数値と終了時の数値を直感的に指定できる。でもRubyでfor文ってあまりメジャーではないっぽい。

基本構文

オーソドックスなfor文
for 変数 in オブジェクト do
    処理
end

doは省略できる。 オブジェクトには配列やハッシュを指定できる。

sushi = %w(まぐろ いくら たまご サーモン しめさば)
for neta in sushi
    puts "時速120kmで#{neta}が流れてきた!"
end
時速120kmでまぐろが流れてきた!
時速120kmでいくらが流れてきた!
時速120kmでたまごが流れてきた!
時速120kmでサーモンが流れてきた!
時速120kmでしめさばが流れてきた!
範囲オブジェクトを使ったfor文
for 変数 in 開始時数値..終了時数値
    処理
end

例として50から100までの数値を加算するfor文を書くと以下の様なかたち。

sum = 0
for i in 50..100
    sum += i
end

p sum    #=> 3825

while文

作り方によってどのようなタイプの繰り返しでも対応できるwhile文。

基本構文

while 条件 do
    処理
end

doは省略可能。 whileは他言語と同様に条件が成り立っている間はループし続ける

i = 0
while i < 5
    puts "寿司をたべた。(#{i}個目)"
    i += 1
end
寿司をたべた。(0個目)
寿司をたべた。(1個目)
寿司をたべた。(2個目)
寿司をたべた。(3個目)
寿司をたべた。(4個目)

iを1ずつ加算しないと大変なことになる(わりと忘れやすい)、for文で範囲オブジェクトを使ったほうが直感的でわかりやすいので、こういった場合はfor文を書いたほうが良さそうです。

until文

if文に対してunless文があるように、while文に対してuntil文がある。 until文は条件が成立するまで繰り返す

基本構文

until 条件 do
    処理
end

doは省略可能。 さきほど書いたwhile文の例をuntil文に書き直してみる。

i = 0
until i >= 5
    puts "寿司をたべた。(#{i}個目)"
    i += 1
end
寿司をたべた。(0個目)
寿司をたべた。(1個目)
寿司をたべた。(2個目)
寿司をたべた。(3個目)
寿司をたべた。(4個目)

カウンタの処理が寿司を食べた後にあるため、iが5になったときは既に寿司を5つ食べていることに注意する。いっつも何回かデバッグして確認してフィーリングで合わせていくことが多いけど(ちゃんと考えよう)。

eachメソッド

azuuun-memorandum.hatenablog.com

既に記事としているため、省略。

loopメソッド

終了条件のないループ、究極までに無駄が削ぎ落とされたシンプルな繰り返しメソッド。ただそれゆえに、終了しないのでbreakしないと死ぬ。もし、繰り返しが止まらなくて涙目状態になった場合、[Ctrl] + Z[Ctrl] + Cで終了させることができる。

基本構文

loop do
    処理
end

主に繰り返しを制御するための命令としてbreaknextがある(正確にはredoもあるが、使われない)。

  • break
    • 繰り返しを中断して, 繰り返しの中から抜ける
  • next
    • 次の回の繰り返し処理に飛ぶ

まとめ

ここで取り上げた繰り返し文やメソッドをその時々でベストなものを選択し、使うことが重要になる。

  • 回数が決まっている! => times
  • オブジェクトから要素を取り出して使いたい! => for, each
  • 条件を自由に指定したい! => while
  • こうなったら抜けろ!という条件のときに => until
  • 回数制限がない! => loop

参考

たのしいRuby 第5版

たのしいRuby 第5版

www.task-notes.com