8
6

【Ruby Silver】Rubyのループ処理まとめ

Last updated at Posted at 2024-02-14

自己紹介

はじめまして、はる(@lemonade_37)と申します。完全異業種からのエンジニア転職を目指して学習をしています。
 

概要

Ruby Silver3.1 の学習のために使用した、Rubyのループ処理のまとめです。
既にわかりやすくまとめられている記事も多いですが、Ruby Silverの問題を解きながら学んだ、引っかかりやすい部分なども含めてまとめています。

初学者のため、間違っている箇所や、紹介した方法よりも良い方法があるかもしれませんので、その際は教えて頂けると嬉しいです🙇

ループ処理の基礎

ループ処理の概念や基礎についてはこちらの記事でまとめました。

配列やハッシュ内で繰り返す系

  

  • each:配列の各要素に対してブロックを評価する。ハッシュにも使用できる。
    ※ブロックを渡した時はdoがない
    [1, 2, 3].each do |i|
      print i
    end
    #=> 123
    
    {a: 1, b: 2}.each {|a| print a}
    #=> [:a, 1][:b, 2]
    

    eachの仲間

    • reverse_each:各要素に対し逆順でブロックを評価する。
    [1, 2, 3].reverse_each do |i|
      print i
    end
    #=> 321
    
    • each_index:配列の各要素のインデックスに対してブロックを実行する。
    ["a", "b", "c"].each_index {|i| print i}
    #=> 012
    
    • each_with_index:配列の各要素と、各要素のインデックスを一緒にブロックを渡せる。
    ["a", "b", "c"].each_with_index {|n, i| puts "値:#{n} インデックス:#{i}"}
    =begin
    =>出力
      値:a インデックス:0
      値:b インデックス:1
      値:c インデックス:2
    =end
    

ループ終了の条件を指定する系

  • while:指定した条件式が真である間(偽になるまで)ループする。
    do省略可
    ary = [1, 2, 3, 4, 5, 6, 7]
    i = 0
    while i < 5 do
      print ary[i]
      i += 1
    end
    #=> 12345
    

  

  • untilwhile not:指定した条件式が偽である間(真になるまで)ループする。whileの逆。
    do省略可
      
  • loopbreakでループを終了させない限りループし続ける。
    a = 0
    loop do
      print a
      a += 1
      if a >= 7
        break
       end
    end
    #=> 0123456
    

ループ回数を指定する系

  • times:指定した回数だけ繰り返す。指定が正の整数でない場合は何もしない
    3.times {print "Hello"}
    #=> HelloHelloHello
    

    timesのループの1回目は0番からスタートするため、出力は下記のようになる。

    3.times do |i|
      print i
    end
    #=> 012
    

  

  • upto指定した数値からMAXの数値まで1ずつ増やしながら繰り返す。指定は整数(負の数もOK)で行う。
    5.upto(10) {|i| print i}
    #=> 5678910
    

    1という数値からスタートし、3という数値までループするため、スタートの数値は1
    timesと混同しないよう注意!

    1.upto(3) do |i|
      print i
    end
    #=> 123
    

  

  • downto指定した数値からMINの数値まで1ずつ減らしながら繰り返す。指定は整数(負の数もOK)で行う。
    0.downto(-5) {|i| print i}
    #=> 0-1-2-3-4-5
    
    3.downto(1) do |i|
      print i
    end
    #=> 321
    

  

  • step指定した数値から指定した上限・下限まで指定した数ずつ増やし / 減らしながら繰り返す。
    上下限に負の数が指定された場合は、下限として解釈される。
    スタートの指定値には少数や負の数も指定できる。(uptodowntoの自由度高いバージョンっぽい)
    例)4.5からスタートし、1.5ずつ増やしながら、7.5まで繰り返す。
    4.5.step(7.5, 1.5) {|n| print n}
    #=> 4.56.07.5
    
    • 各ステップの大きさを指定しなければ、1回の繰り返しの増減幅はデフォルトで1になる。
      2.step(5) {|n| print n}
      #=> 2345
      
    • 整数と少数を混ぜてもエラーにはならない。どちらか片方でも少数のときは、出力が少数で表示される
      2.0.step(5) {|n| print n}
      #=> 2.03.04.05.0
      

その他

  • nextnextを使った時点でそれ以降の処理を飛ばして次のループに移る。
    例)2の時はnext以降のprint aが飛ばされて、2だけ出力されない。
    [1,2,3,4].each do |a|
      next if a == 2
      print a
    end
    #=> 134
    

  

  • redoredoを使うとループの初めから処理を繰り返す。

redoするかどうかは、each do |a|の部分のaの値で判断している。redoの繰り返しは1回のみ行われる。
例文では、each do |2|のときの処理が2回繰り返されている。each文の中でa += 1aの値は3になっているので、3が2回出力されている。

[1,2,3,4].each do |a|
  a += 1
  print a
  redo if a == 2
end
#=> 23345

  

  • breakbreakを使った時点でループを抜け出すことができる。

まとめ

苦手意識のあったループ処理ですが、ひとつひとつ整理して、実際にコードを動かしてみることで少し理解できました。
Ruby Silverをきっかけに勉強できてよかったです!

 

参考記事

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6