Help us understand the problem. What is going on with this article?

Rubyのシンタックス勉強用(繰り返し処理の制御 編)

More than 1 year has passed since last update.

Rubyのシンタックスを息を吸うように書くために、少しでも理解が怪しいシンタックスを繰り返したくために書きます。

繰り返し処理の脱出

1から10までを出力するuptoメソッドの繰り返し処理の中に5以上で繰り返し処理を抜ける条件文を書いてください。

正解

1.upto(10) do |i|
  p i
  break if i >= 5
end

breakuptoeachwhileなどでも使えます。

参考: プロを目指す人のためのRuby入門_138p

繰り返し処理をネストさせた場合の break の挙動

内側にbreakがあるので、内側だけ抜けます。外側は全て実行されます。

areas = ['tokyo','chiba','osaka']
numbers = [1,2,3,4,5]

areas.each do |a|
  numbers.shuffle.each do |n|
    p n
    break if n == 5
  end
  p a
end

return

3
2
1
5
"tokyo"
5
"chiba"
4
2
5
"osaka"

shuffleメソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。

参考: プロを目指す人のためのRuby入門_139p

throwとcatchを一気に全ループを抜ける処理

2つの繰り返し処理を一気に抜ける処理を書いて覚えてください。

areas = ['tokyo','chiba','osaka']
numbers = [1,2,3,4,5]

catch :done do
  areas.shuffle.each do |area|
    numbers.shuffle.each do |number|
      p "#{area}==#{number}"
      if area == 'tokyo' && number == 1
        throw :done
      end
    end
  end
end

p '脱出'

area == 'tokyo' && number == 1だったら脱出します。

return

"chiba==3"
"chiba==4"
"chiba==5"
"chiba==2"
"chiba==1"
"osaka==5"
"osaka==2"
"osaka==3"
"osaka==1"
"osaka==4"
"tokyo==4"
"tokyo==2"
"tokyo==1"
"脱出"

shuffleメソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。

参考: プロを目指す人のためのRuby入門_140p

繰り返し処理における break と return の違い

  • break: 繰り返しだけ抜ける
  • return: メソッドごと抜ける
def greeting(name)
  numbers = [1,2,3,4,5]
  numbers.shuffle.each do |number|
    p "こんにちは、#{name} No.#{number}さん"
    break if number == 1
  end
  p 'どうぞ'
end

greeting('sato')

return

"こんにちは、sato No.4さん"
"こんにちは、sato No.5さん"
"こんにちは、sato No.1さん"
"どうぞ"

shuffleメソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。

繰り返しだけ抜けているので、文字列(どうぞ)も出力されます。

ですが、returnは、メソッドごと抜けるので、文字列どうぞが出力されません。

def greeting(name)
  numbers = [1,2,3,4,5]
  numbers.shuffle.each do |number|
    p "こんにちは、#{name} No.#{number}さん"
    return if number == 1
  end
  p 'どうぞ'
end

greeting('sato')

return

"こんにちは、sato No.3さん"
"こんにちは、sato No.1さん"

shuffleメソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。

参考: プロを目指す人のためのRuby入門_142p

next

繰り返し処理を途中だけ抜けるnextの処理を書いて覚えてください。

areas = ['tokyo','chiba','osaka']

areas.each do |area|
  (1..5).each do |n|
    next if n.even?
    p "id:#{n} is #{area}"
  end
end

偶数の時だけ、内側の繰り返し処理を脱出しています。

return

"id:1 is tokyo"
"id:3 is tokyo"
"id:5 is tokyo"
"id:1 is chiba"
"id:3 is chiba"
"id:5 is chiba"
"id:1 is osaka"
"id:3 is osaka"
"id:5 is osaka"

入れ子になった場合、一番内側にnextがあるなら、breakと同じで、一番内側だけ処理を抜けます。

参考: プロを目指す人のためのRuby入門_140p

ryosuketter
偏差値50台 大学理系院卒、一部上場企業でWebエンジニア(3年目)半人前レベル。普通の34歳おっさんでも頑張ったら一人前のフロントエンドエンジニアになれるのか?の検証 Qiita です。
https://note.com/ryosuketter
life-a-tm
人生のイベントや日常生活に密着した比較サイト、情報サイト等様々なウェブサービスを企画・開発・運営
https://life.a-tm.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away