choco-ballの日記

勉強のアウトプットのためのブログ

Ruby(8) メソッドを用いた繰り返し

今回はメソッドを用いた繰り返し処理についてです。
まずはeachメソッドからです。
このメソッドは前回学習したfor文と動きが似ています。
基本的な記述は以下のように行います。

オブジェクト.each do |変数|
 処理
end


では前回使った例と同じような記述をeachメソッドを使って行ってみましょう。

 ary = ["スギ","ヒノキ","イネ"]

 ary.each do |allergies|
   puts "今年は#{allergies}の花粉がやばい"
 end
end
# 出力結果
# 今年はスギの花粉がやばい
# 今年はヒノキの花粉がやばい
# 今年はイネの花粉がやばい


処理の流れとしてはeachメソッドを使って配列aryを変数allergiesに一つずつ入れて処理を行います。
パイプ||の中で宣言している変数はブロック変数(ブロックパラメーターとも)と呼ばれるもので、
対象ブロック(do~endまで)のみで有効な変数です。
繰り返し処理はオブジェクトの中に格納されている要素数回行います。
次はtimesメソッドです。
こちらは指定した回数繰り返し処理を行うというものになります。

integer.times do |変数|
 処理
end

上記が基本的な記述です。
変数には自動的に0が代入されます。

10.times do |i|
 puts i
end
# 結果は0~9までの数値が出力されます(0からカウントして10回処理を行うため)


次はuptoメソッドです。
指定した値が最大値に達するまでの間処理を継続します。

integer.upto(最大値) do |変数|
 処理
end


上記が基本的な記述です。
実際に使ってみましょう。

i = 1
5.upto(10) do |num|
  puts "#{i}回目、数値は#{num}"
  i += 1
end
# 結果
# 1回目、数値は5
# 2回目、数値は6
# 3回目、数値は7
# 4回目、数値は8
# 5回目、数値は9
# 6回目、数値は10


例からわかるようにオブジェクトに指定したintegerの値がブロック変数に入っています。
そしてブロック変数が繰り返しとともにカウントアップしていき、最大値に指定した値に達したときに処理が終了します。
次はdowntoメソッドです。
こちらはuptoとは逆で開始値から繰り返す度にカウントダウンしていき最小値まで処理を繰り返します。

integer.downto(最小値) do |変数|
 処理
end


上記が基本的な記述の仕方です。

i = 1
10.downto(5) do |num|
  puts "#{i}回目、数値は#{num}"
  i += 1
end
# 結果
# 1回目、数値は10
# 2回目、数値は9
# 3回目、数値は8
# 4回目、数値は7
# 5回目、数値は6
# 6回目、数値は5


例を見てわかるようにuptoとは逆の処理になっていますね。
では次はstepメソッドです。
こちらはuptoと似ているのですが、大きな違いとしては小数点以下の値を扱えることです。

オブジェクト.step(最大値,1ループごとのカウントアップ数) do |変数|
 処理
end


となります。
通常1ずつ上昇するカウントアップの値の指定することで小数点以下のカウントアップが可能です。

i = 1
5.0.step(5.5,0.1) do |num|
  puts "#{i}回目、数値は#{num}"
  i += 1
end
# 結果
# 1回目、数値は5.0
# 2回目、数値は5.1
# 3回目、数値は5.2
# 4回目、数値は5.3
# 5回目、数値は5.4
# 6回目、数値は5.5


上記の処理は開始値を5.0として変数numに代入して出力。
1回繰り返すごとにブロック変数に0.1加算していき、5.5より大きくなったら終了という処理です。

次はloopメソッドです
こちらは一言で言ってしまうと
無限ループを作るメソッドです。
記述はとてもシンプルで

loop do
 処理
end


これだけです。
ただこの状態だと処理が永遠に終わらないのでループを抜ける処理を記述する必要があります。
そこで使うのがbreak文というものです。
今は一番内側のループ処理を中断して抜けるために使用します。
では実際に使ってみましょう。

i = 0
loop do
  
  puts i
  i += 1
  
  if i > 5
    puts "条件を満たしたのでbreak実行"
    break
  end
end

puts "ループ処理終了"

# 結果
# 0
# 1
# 2
# 3
# 4
# 5
# 条件を満たしたのでbreak実行
# ループ処理終了


上記のようにbreak文は強制的に処理を終了させます。
繰り返し処理ではたくさんの文やメソッドが出てきましたがそれぞれ性質が違うので
しっかりと性質を理解した上で使うようにしましょう。
では今回はこの辺りで。