##繰り返し処理の種類
Rubyの繰り返し処理の種類として、eachメソッド、for文、whil ,until文、timesメソッド、up_toメソッドなどがあるそうです。paizaのアルゴリズムで繰り返し処理を行う際にどの処理を使えば良いかイマイチ理解していないので、使い方、特徴をまとめる。
##まず前提
繰り返し処理は、配列(複数のデータを順番に並べて格納できるオブジェクト(Arrayクラス))、ブロック(メソッドの引数として渡すことができる処理のかたまり)と一緒に使うことが多い。Rubyは、eachメソッドを使って反復処理を行う場合が大半。※多言語では、for,foreach構文を使うことが多い。
##eachメソッド
Rubyが言語機能として繰り返し処理を実行しているのではなく、配列のeachメソッドが繰り返し処理を実行している。
eachメソッドの役割は、配列の要素から最後までを順番に取り出すことができる。その取り出したものをどのように扱うかはブロックに記述する。
#例(配列の要素を加算していく処理)
numbers = [1, 2, 3, 4]
sum = 0
numbers.each do |n|
sum += n
end
sum #=> 10
###ブロックとは
ブロックは先ほどのコードの中の以下の部分。|n|のnはブロック引数(名前は自由)といい、eachメソッドから渡された配列の要素が入る。
#ブロック部分
do |n|
sum += n
end
###ブロック(改行なしバージョン)
#do .. endの代わりに{}を使う
numbers.each {|n| sum += n}
##timesメソッド
配列を使わず単純にn回処理を繰り返したい、という場合はIntegerクラスのtimesメソッドを使う。
sum = 0
#処理を5回繰り返す。nには0,1,2,3,4が入る。
5.times {|n| sum += n} or 5.times{sum += 1}
sum #=> 10
##uptoメソッドとdowntメソッド
nからmまで数値を1つずつ増やしながら何かを処理したい場合は、Integerクラスのuptoメソッドを使う。逆に、1つずつ減らすdowntoメソッド。
#uptoメソッド
a = []
10.upto(14) {|n| a << n}
a #=> [10, 11, 12, 13 ,14]
#downtoメソッド
a = []
14.doentown(10){|n| a << n}
a #=> [14 ,13 ,12 ,11 ,10]
##while文とuntil文
繰り返し処理用の構文。
whileの後の条件式が真であれば実行。untilの後の条件式が偽であれば実行。
※whileの後にtrueを使うと無限ループの処理を行える。脱出するにはbreakを使う。
#while文
a = []
while a.size < 5
a << 1
end
a #=> [1 ,1 ,1 ,1 ,1]
#until文
a = [10 ,20 ,30 ,40 ,50 ]
until a.size <= 3 #配列aの要素が3つ以下でない限り最後の要素を消し続ける。
a.delete(-1)
end
a #=> [10 ,20 ,30]
##for文
for文はeachメソッドと使う用途は同じと考えて良い。しかしRubyはeachメソッドを使うほうが一般的らしい。
numbers = [1 ,2 ,3 ,4]
sum = 0
for n in numbers
sum += n
end
sum #=> 10
#doを入れて1行で書くことも可能。
for n in numbers do sum += end
##まとめてみての感想
とりあえず、eachメソッドをベースに他のmapメソッドなどを使って、メソッドを色々覚えていくことが良さそう。