難波校OPEN記念入学金無料キャンペーン実施中!
DMM WEBCAMPは難波校の開校を記念して、通常100,000円(税抜)無料で入校できるキャンペーンを実施しています。
関西未経験からエンジニアになりたいプログラミングで人生を変えたい方はこの機会にぜひご検討ください!
※プログラミングを学んでみたいけど、時間がなくて全文の記事が読めない!という方は、WebCampの無料説明会(毎日開催)に参加してみてください!

Ruby繰り返し処理 step

Rubyで繰り返しの処理を作成していると、カウンターを1つずつ変化させるのでは効率が悪いときがあります。

そんなときに使えるのが、stepメソッドです。

stepメソッドは、1以外の単位で増減させながら繰り返し処理を行うことができる、とても柔軟なメソッドなんです。

また、「step実行」を検索してたどり着かれた方にも、役に立つ情報がありますので、ぜひ最後までお読みください。

stepとは

stepメソッドは、数値を表すオブジェクトのメソッドで、オブジェクトの示す数値から増減しながら繰り返し処理を行うことができます。

構文は、以下のようになります。

数値オブジェクト.step(限界値, 増減値) do |変数|
  処理
end

※do〜endは、{〜}でも構いません。

数値オブジェクトの示す数値から限界値を超えるまで、増減値だけ加えながら、処理を繰り返します。

なお、このとき、変数には変化した値が格納されますが、|変数|は省略することも可能です。

stepは小数が使える

stepのもっとも特徴的なところは、すべての値に小数を使用することができることです。

これは、他の繰り返しにはできない大きな特徴でしょう。

プログラムの中で小数の繰り返しを使うシーンはある程度限られているかもしれませんが、いざというときに面倒な処理を作る必要がありませんので、無駄な不具合を生まずに済みます。

具体的なプログラムを紹介しましょう。

step00.rb

0.5.step(3, 0.5)  do |f|
  puts f
end

(結果)

0.5
1
1.5
2
2.5
3

もちろん、整数の繰り返しも可能ですので、2つずつや3つずつ増減するのも直感的に作れます。

step01.rb

0.step(6, 2)  do |f|
  puts f
end

(結果)

0
2
4
6

カウントダウンもおてのもの

増減値を設定できますので、マイナス側への繰り返し(カウントダウン)も簡単に作ることができます。

step02-1.rb

0.step(-3, -1)  do |f|
  puts f
end

(結果)

0
-1
-2
-3

もちろん、小数でのカウントダウンも同じようにできます。

step03.rb

0.step(-6, -1.5)  do |f|
  puts f
end

(結果)

0.0
-1.5
-3.0
-4.5
-6.0

ここまで見てきたように、stepメソッドを使うことで、少し複雑な繰り返し処理をとてもすっきりと記載することができるシーンがあります。

例えば、step02-1.rbと同じ表示をするプログラムをforで書くとすると、どうなるでしょうか?

step02-2.rb

out = 0

for i in 0..3
  puts out - i
end

forは容易にカウントダウンができませんので、step02-2.rbのように、表示だけカウントダウンしているように見せかける場合がほとんどです。そのため、出力用の余計な変数outが最初に宣言されています。

これは、ぱっと見てカウントアップしているが、それを無理矢理カウントダウン表示にしているわけですから、プログラムを読もうとしている人にとって、とても頭を悩ませるものでしょう。

プログラムを作る上で、すっきりと読みやすいということはとても重要な点です。そういう意味では、step02-2.rbのような場合は、積極的にstepを使っていきましょう。

じつは、数値オブジェクトには、日付もあります。そのため、stepを使えば、日付のカウントも記載することが可能です。

step04.rb

require 'date'

dt = Date.new(2017, 7, 13)
dt.step(dt + 7, 1) do |day|
  puts day
end

(結果)

2017-07-13
2017-07-14
2017-07-15
2017-07-16
2017-07-17
2017-07-18
2017-07-19
2017-07-20

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】

rangeのstepメソッド

Rubyでの繰り返し処理というと、まっさきに出てくるのが、次のようなforでの繰り返しでしょう。

step05.rb

for i in 0..3
  puts i
end

ここで使われている「(0..3)」の部分がrangeオブジェクトです。

じつは、このrangeオブジェクトでも、stepメソッドが使えます。

rangeオブジェクトでstepメソッドを使う場合、すでにrangeメソッドが範囲を示しているので、限界値は不要で、増減値だけ設定します。

なお、rangeオブジェクトは、カウントダウンする範囲は作れません。そのため、増減値もマイナスの設定ができませんので、注意が必要です。

step06.rb

(0..7).step(2) do |i|
  puts i
end

(結果)

0
2
4
6

基本的にはforで繰り返しを作るが、同じ範囲で+2や+3などして繰り返したい場合に、stepメソッドを使えば、ほぼ同じ形で処理を作れますので、プログラムが見やすくなります。

stepとmap

mapメソッドというのは、配列(範囲)の値を処理した結果を配列として返してくれるメソッドです。

データをまとめて処理(変換)したいときなどに重宝します。

例えば、以下のようなプログラムになります。

step07-1.rb

print (0..10).map { |i| 
  i *= i
}

(結果)

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

一部だけ処理した配列を取得したい

mapメソッドは配列のすべての要素に繰り返し処理を行います。しかし、処理の都合上、配列の特定の要素にだけ行いたい場合もあるでしょう。

そんなときにstepメソッドを使えばすっきり書けそうだと考える人も少なくないと思います。

例えば、step7-1.rbを改造して、偶数のみの二乗の配列を作る場合を考えてみましょう。

まず、偶数を取り出すので、(0..10)にstepメソッドを使います。増減値を2にすれば、偶数を取得できますね。

print (0..10).step(2)

なお、上のプログラムを実行すると、「#」のように表示されますが、正常ですので、驚かないでください。

これは、stepメソッドが「Enumeratorクラス」というものを返しているということです。じつは、このEnumeratorクラスというのが、eachやmapなどの繰り返し処理を行えるもので、Enumeratorクラスが返るということは、帰ってきたものに対してmapメソッドを利用できるということを表しています。

これで偶数を取り出しましたので、mapメソッドを使って二乗した値の配列を作りましょう。

step07-2.rb

print (0..10).step(2).map { |i| i *= i }

(結果)

[0, 4, 16, 36, 64, 100]

このように、stepメソッドで抽出した値に対して、mapメソッドで処理することも簡単に行うことができます。また、上に書いたようにmapメソッドだけではなく、他の繰り返し処理を行う種々のメソッドも使うことができますので、いろいろと試してみましょう。

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

「step実行」と検索して来られた人へ

本稿は、stepメソッドの解説を主としていますが、同じ単語を使った「step実行」や「ステップ実行」で本稿にたどり着いた人も少なくないかもしれません。

「step実行」は、デバッグ時に行う操作で、プログラムの処理ごと(この単位を1ステップと呼びます)に処理を停止して、変数の状態などを確認できるものです。

そのため、ここで説明しているstepメソッドとはまったく違う内容になりますが、せっかくですので簡単に説明しておきます。

Rubyに標準搭載されているデバッグ機能

プログラムの動作確認をする(動作中の変数の状態を表示したり、どこまで進んでいるかを確認したりする)とき、もっとも簡単な方法は、「puts」や「print」「p」などで表示させることでしょう。

基本的にはそれで問題なく不具合の修正(デバッグ)ができます。

しかし、大規模なプログラムや難解なプログラムの場合はprintの数が多くなるなどして、難しいこともあります。

そんなときのために、Rubyでは標準でデバッガが搭載されています。

標準デバッガを使用することで、プログラムをステップ実行してその瞬間の変数の値を確認することができるのです。

標準デバッガの使用方法

標準デバッガを使うためには、いつものプログラム実行時にコマンドオプションを追加するだけです。

例えば、test.rbをデバッガで実行する場合には、以下のように実行します。

> ruby -r debag test.rb

すると、コマンドプロンプト上で以下のような表示になって、入力待ちになります。

(rdb:1)

この状態で、デバッグコマンドを入力することで、ステップ実行や変数の中身を見ることができるわけです。

なお、デバッグコマンドについては、helpもしくはhと入力すれば一覧を表示してくれますので、確認しておきましょう。

(rdb:1) h
Debugger help v.-0.002b
Commands
  b[reak] [file:|class:]<line|method>
  b[reak] [class.]<line|method>
                             set breakpoint to some position
  wat[ch] <expression>       set watchpoint to some expression
  cat[ch] (<exception>|off)  set catchpoint to an exception
  b[reak]                    list breakpoints
  cat[ch]                    show catchpoint
  del[ete][ nnn]             delete some or all breakpoints
  disp[lay] <expression>     add expression into display expression list
  undisp[lay][ nnn]          delete one particular or all display expressions
  c[ont]                     run until program ends or hit breakpoint
  s[tep][ nnn]               step (into methods) one line or till line nnn
  n[ext][ nnn]               go over one line or till line nnn
  w[here]                    display frames
  f[rame]                    alias for where
  l[ist][ (-|nn-mm)]         list program, - lists backwards
                             nn-mm lists given lines
  up[ nn]                    move to higher frame
  down[ nn]                  move to lower frame
  fin[ish]                   return to outer frame
  tr[ace] (on|off)           set trace mode of current thread
  tr[ace] (on|off) all       set trace mode of all threads
  q[uit]                     exit from debugger
  v[ar] g[lobal]             show global variables
  v[ar] l[ocal]              show local variables
  v[ar] i[nstance] <object>  show instance variables of object
  v[ar] c[onst] <object>     show constants of object
  m[ethod] i[nstance] <obj>  show methods of object
  m[ethod] <class|module>    show instance methods of class or module
  th[read] l[ist]            list all threads
  th[read] c[ur[rent]]       show current thread
  th[read] [sw[itch]] <nnn>  switch thread context to nnn
  th[read] stop <nnn>        stop thread nnn
  th[read] resume <nnn>      resume thread nnn
  pp expression              evaluate expression and pretty_print its value
  p expression               evaluate expression and print its value
  r[estart]                  restart program
  h[elp]                     print this help
  <everything else>          evaluate

以上のようにたくさんのコマンドが準備されていますが、ステップ実行と変数の確認であれば、以下の5つを憶えておけば良いでしょう。

ステップ実行 n

「n」と入力することで、ステップ実行することができます。

ステップ実行すると、実行した行を表示して、また入力待ちになります。また、そのときにprintやputsなどで表示する処理があった場合は、その表示も行われます。

変数の表示 p

「p 変数名」と表示することで、そのときの変数の内容を表示することができます。

ブレイクポイントの設定 b

「b 行番号」とすると、指定の行にブレイクポイントを設定することができます。

ブレイクポイントというのは、デバッグ実行中に中断して止める行のことです。1行1行ステップ実行している場合はあまり関係ありませんが、大規模なプログラムなどで途中までは一気に処理を進めて必要な箇所で止めたい場合に重宝します。

ブレイクポイントまで処理を進める c

「c」と入力することで、ブレイクポイントが設定されているところまで処理を進めます。

もし、ブレイクポイントが設定されていなければ、プログラムの終了まで処理が進んで終了します。

デバッグ実行の終了 q

デバッグ実行の途中で終了したい場合は、「q」と入力することで、終了することができます。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

まとめ

stepメソッドでの繰り返しと、デバッグについて解説しました。

Rubyには繰り返し処理がいくつも存在しており、それぞれに得意不得意があります。

もちろん、そんなことを考えずに応用の利くeachで統一してしまうのも1つのスタイルです。

しかし、処理に合わせて、それを得意とする繰り返しを使えば、プログラムコードがすっきりして見やすくなります。

プログラムを作る上で重要な再利用のしやすさと読みやすさを考えれば、最適な繰り返し処理を行うべきでしょう。

・stepは数値オブジェクトや範囲オブジェクトなどのメソッド
・stepは、すべての値に小数を使用することができる
・stepは、カウントダウンや任意の単位での増減ができる
・stepからはEnumeratorクラスが返ってくるため、eachやmapが使える
・step実行というのは、デバッグの手法の1つ
・Rubyには標準でデバッガが搭載されている

DMM WEBCAMP ONLINE/プログラミングコースについて

WEBCAMPでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

DMM WEBCAMP ONLINEが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWEBデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事