【Ruby】繰り返し
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2013/06/04
- メディア: 単行本
- この商品を含むブログ (22件) を見る
今回は6章「繰り返し」
繰り返しのための構文とメソッドをまとめると、次の6つとなる。
- times メソッド
- for 文
- while 文
- until 文
- each メソッド
- loop メソッド
times メソッド
一定回数だけ同じ処理をさせるという繰り返し
7.times do puts "いちめんのなのはな" end #「いちめんのなのはな」を7回表示
7.times { puts "いちめんのなのはな" } # do ~ end の代わりに {} でも可
5.times do |i| puts "#{i}回目の繰り返しです" end #繰り返しの回数を知ることも出来る
繰り返しの回数は0から始まる点に注意。
また、 times メソッドでは変数に初期値を与えることが出来ない。
for 文
from = 5 to = 10 sum = 0 for i in from..to #( do ) sum = sum + i # sum += i でも可 end puts sum #5から10までの整数の合計を表示
.. ( ... )は範囲オブジェクトを作るための記号。
上のような構文は特殊な形で、一般的には次のような構文になる。
for 変数 in オブジェクト ( do ) 繰り返したい処理 end
names = [ "Scala", "Perl", "Ruby" ] for name in names puts name end #配列の要素を表示
while 文
sum = 0 i = 1 while sum < 50 sum += i i += 1 end puts sum
条件が成り立っている間、処理が実行される。
until 文
sum = 0 i = 1 while sum >= 50 sum += i i += 1 end puts sum
条件を満たしていない場合に、処理が実行される。
each メソッド
オブジェクトの集まりに対して、それを1つずつ取り出す時に使う。
for 文で行っていた処理によく似ていて、実際に for 文でのプログラムを each メソッドを使った形に直すことは容易である。
from = 5 to = 10 sum = 0 (from..to).each do |i| sum += i end puts sum
names = [ "Scala", "Perl", "Ruby" ] names.each do |name| puts name end
loop メソッド
終了条件のない、ただの繰り返しのためのメソッド。
loop do print "Ruby" end #実行非推奨
上のプログラムを実行すると、永遠に "Ruby" の文字が表示されてしまう。
このようなことにならないために、 loop メソッドでは break を使って繰り返しを途中で抜ける。
i = 0 loop do i += 1 if i == 5 break end puts 10 end
繰り返しの制御
先ほどの break のように、Ruby には繰り返しを制御する3つの命令がある。
- break
繰り返しを中断し、繰り返しの中から抜ける。
i = 0 [ "Perl", "Python", "Scala", "Ruby"].each do |lang| i += 1 if i == 3 break end p [i, lang] end
実行結果はこうなる。
[1, "Perl"] [2, "Python"]
- next
次の回の繰り返しに処理を移す。
i = 0 [ "Perl", "Python", "Scala", "Ruby"].each do |lang| i += 1 if i == 3 next end p [i, lang] end
実行結果はこう。
[1, "Perl"] [2, "Python"] [4, "Ruby"]
i が3のときの処理がスキップされ、このような結果になる。
- redo
同じ条件で繰り返しをやり直す。
i = 0 [ "Perl", "Python", "Scala", "Ruby"].each do |lang| i += 1 if i == 3 redo end p [i, lang] end
実行結果。
[1, "Perl"] [2, "Python"] [4, "Scala"] [5, "Ruby"]
redo は、使い方を間違えると、まったく同じ条件のまま、ひたすら同じ処理を繰り返すことになってしまうので、使うときは注意が必要です。
redo 、あまり使う機会は無さそう・・・?