LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-14

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0