どなブロ

エンジニアァのブログです

たのしいRuby 第6章

最後の方集中力途切れてしまった

繰り返し

繰り返しの実現方法

  • 繰り返しのための構文を利用する
  • メソッドで実現する
    -> メソッドにブロックを渡して、その中に繰り返す処理を書く

timesメソッド

  • 一定の回数だけ同じ処理をさせるのに便利
7.times do
  puts "ななかいプッツプツ"
end

-> 結果
$ ruby times.rb

ななかいプッツプツ
ななかいプッツプツ
ななかいプッツプツ
ななかいプッツプツ
ななかいプッツプツ
ななかいプッツプツ
ななかいプッツプツ
  • ブロック「do ~ end」を使って書く
  • 下記のように「{}」も使える
繰り返す回数.times {
  繰り返す処理
}
  • 繰り返している回数を取得することもできる
5.times do |i|
  puts "#{i}回目のプッツ"
end

-> 結果
$ ruby times02.rb

0回目のプッツ
1回目のプッツ
2回目のプッツ
3回目のプッツ
4回目のプッツ

for文 (特殊な例)

for 変数 in 開始時の数値..終了時の数値 do    # do省略可
  繰り返す処理
end

-> 「..」または「...」は範囲オブジェクトを作る記号
Ex)

sum = 0
for i in 1..5
  sum = sum + i
end
puts “合計は#{sum}”

-> 結果
$ ruby for.rb

合計は15
  • 開始時と終了時の値を自由に変更できるのが特徴

Ex)

from = 10
to = 20
sum = 0
for i in from..to
  sum += i
end
puts sum

一般的なfor文

for 変数 in オブジェクト do # do省略可
  繰り返す処理
end

Ex)

names = ["awk", "Perl", "Python", "Ruby"]
for name in names
  puts name
end

-> 結果
$ ruby for_names.rb

awk
Perl
Python
Ruby

while文

  • 条件を満たしている間ループ
while 条件 do  # do省略可
  繰り返す処理
end

Ex)

sum = 0
i = 1
while sum < 50
  sum += i
  i += 1
end
puts sum

-> 結果
$ ruby while.rb

55

until文

  • 条件を満たしていない間ループ
sum = 0
i = 1
until sum >= 50
  sum += i
  i += 1
end
puts sum

-> 結果
$ ruby until.rb

55

eachメソッド

  • オブジェクトの集まりに対して、それを1つずつ取り出す
  • ブロックを「{~}」でも記述できる
オブジェクト.each do |変数|
  繰り返す処理
end

Ex)

names = ["awk", "Perl", "Python", "Ruby"]
names.each do |name|
  puts name
end

-> 結果
$ ruby each_name.rb

awk
Perl
Python
Ruby

loopメソッド

  • 終了条件のない繰り返しのためのメソッド
loop do
  puts “Rubyend

繰り返しの制御

命令 用途
break 繰り返しを中断し、繰り返しの中から抜ける
next 次の回の繰り返しに処理を移す
redo 同じ条件で繰り返しをやり直す
  • redoはほとんど使われないらしい
puts "breakの例:"
names = ["Perl", "Python", "Ruby", "Scheme"]
i = 0

names.each do |lang|
  i += 1
  if i == 3
    break
  end
  p [i, lang]
end

puts = "nextの例:"
j = 0
names.each do |lang|
  j += 0
  if i == 3
    next
  end
  p [j, lang]
end

-> 結果
$ ruby break_next.rb

breakの例:
[1, "Perl"]
[2, "Python"] # breakで繰り返し処理から抜け、”Ruby”と”Scheme”が表示されない
nextの例:
[1, "Perl"]
[2, "Python"]
[4, "Scheme"] # nextで”Ruby"だけ飛ばされる

まとめ

  • 繰り返しの構文・メソッドの主な用途
構文・メソッド 主な用途
timesメソッド 回数の指定された繰り返し
for文 オブジェクトから要素を取り出す場合
while文 条件を自由にしたい場合
until文 whileではわかりにくい条件を指定したい場合
eachメソッド オブジェクトから要素を取り出す場合
loopメソッド 回数制限のない繰り返し

  • 広く使われているルールとして、
  • 複数行に分けて書く場合は「do ~ end」
  • 1行にまとめる場合は「{ ~ }」

    感想

  • 繰り返しでこんなたくさんあるんか〜
  • 適切な使い分けが難しそう、まぁ繰り返し書く段になったら「いろいろあったけど何使えばいいかな〜」って考えればいっか

以上