Rubyのシンタックスを息を吸うように書くために、少しでも理解が怪しいシンタックスを繰り返したくために書きます。
繰り返し処理の脱出
1から10までを出力するupto
メソッドの繰り返し処理の中に5以上で繰り返し処理を抜ける条件文を書いてください。
正解
1.upto(10) do |i|
p i
break if i >= 5
end
break
はupto
やeach
、while
などでも使えます。
繰り返し処理をネストさせた場合の 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
メソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。
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
メソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。
繰り返し処理における 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
メソッド : 配列の要素の順番をランダムに入れ替えた新しい配列を返すメソッド。このメソッドを使用しているため、必ずこの結果になるとは限りません。
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
と同じで、一番内側だけ処理を抜けます。