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

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

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

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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