Search

検索したいワードを入力してください

2019年04月10日

Rubyのstepメソッドで間隔をあけた繰り返し処理をする

本記事では、Rubyにおける、ループ変数に任意の間隔を指定できるstepメソッドについて紹介します。このメソッドでは、数学でいう等差数列の作成ができます。ただし、与えた引数によっては一回も実行されないこともあるので、それについても説明します。

stepメソッドとは

Rubyのstepメソッドでは、初期値、終了値、間隔を指定し、ブロックを与えてループを実行することができます。このメソッドで、数学でいう等差数列を作成できます。構文は以下の通りです。

初期値.step(終了値,間隔) do |変数| 実行する処理 end

ループの最後で、変数が終了値と一致する場合は、その値についても実行されます。

uptoメソッド,downtoメソッドとの違い

upto、downtoメソッドでは、間隔が1の処理しか行えませんが、stepメソッドでは、任意の間隔を指定できます。なお、間隔を指定しない場合、uptoメソッドと同じように扱えます。

nums=[]

1.step(10) do |i|
nums.push(i)
end

p nums #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

timesメソッドとの違い

timesメソッドでは、ループ変数の初期値は0として、間隔を1として、終了値n-1まで繰り返します。一方、stepメソッドでは、任意の初期値、終了値、間隔が指定できます。なお、終了値を指定するのではなく、指定した回数だけ増加させたい場合はtimesメソッドが使えます。

nums=[]
i=2

50.times do
nums.push(i)
i+=3
end

p nums #=> [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 101, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149]

Rubyのstepメソッドでできること

stepメソッドで奇数の番号を割り振る

以下のRubyスクリプトでは、1から99までの、奇数の数列を作成します。nums配列のインデックスiについて、nums[i]=2*i+1となります。

nums=[]

1.step(100,2) do |i|
nums.push(i)
end

p nums #=> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

stepメソッドで小数点を指定する

stepメソッドは小数(Float)にも使うことができます。以下のRubyスクリプトでは、華氏0度から100度までの温度を摂氏に換算した表を、0.5度刻みで作成します。

def ftoc(f)
5.0/9*(f-32)
end

nums=[]

cnt=0

0.0.step(100.0,0.5) do |f|
puts format"%5.1fF = %5.1fC",f,ftoc(f)
cnt+=1
print cnt%4==0? "\n":" "
end

実行結果

0.0F = -17.8C 0.5F = -17.5C 1.0F = -17.2C 1.5F = -16.9C
2.0F = -16.7C 2.5F = -16.4C 3.0F = -16.1C 3.5F = -15.8C
4.0F = -15.6C 4.5F = -15.3C 5.0F = -15.0C 5.5F = -14.7C
6.0F = -14.4C 6.5F = -14.2C 7.0F = -13.9C 7.5F = -13.6C
8.0F = -13.3C 8.5F = -13.1C 9.0F = -12.8C 9.5F = -12.5C
10.0F = -12.2C 10.5F = -11.9C 11.0F = -11.7C 11.5F = -11.4C
12.0F = -11.1C 12.5F = -10.8C 13.0F = -10.6C 13.5F = -10.3C
14.0F = -10.0C 14.5F = -9.7C 15.0F = -9.4C 15.5F = -9.2C

16.0F = -8.9C 16.5F = -8.6C 17.0F = -8.3C 17.5F = -8.1C
18.0F = -7.8C 18.5F = -7.5C 19.0F = -7.2C 19.5F = -6.9C
20.0F = -6.7C 20.5F = -6.4C 21.0F = -6.1C 21.5F = -5.8C
22.0F = -5.6C 22.5F = -5.3C 23.0F = -5.0C 23.5F = -4.7C
24.0F = -4.4C 24.5F = -4.2C 25.0F = -3.9C 25.5F = -3.6C

(中略)

76.0F = 24.4C 76.5F = 24.7C 77.0F = 25.0C 77.5F = 25.3C
78.0F = 25.6C 78.5F = 25.8C 79.0F = 26.1C 79.5F = 26.4C
80.0F = 26.7C 80.5F = 26.9C 81.0F = 27.2C 81.5F = 27.5C
82.0F = 27.8C 82.5F = 28.1C 83.0F = 28.3C 83.5F = 28.6C
84.0F = 28.9C 84.5F = 29.2C 85.0F = 29.4C 85.5F = 29.7C

86.0F = 30.0C 86.5F = 30.3C 87.0F = 30.6C 87.5F = 30.8C
88.0F = 31.1C 88.5F = 31.4C 89.0F = 31.7C 89.5F = 31.9C
90.0F = 32.2C 90.5F = 32.5C 91.0F = 32.8C 91.5F = 33.1C
92.0F = 33.3C 92.5F = 33.6C 93.0F = 33.9C 93.5F = 34.2C
94.0F = 34.4C 94.5F = 34.7C 95.0F = 35.0C 95.5F = 35.3C
96.0F = 35.6C 96.5F = 35.8C 97.0F = 36.1C 97.5F = 36.4C
98.0F = 36.7C 98.5F = 36.9C 99.0F = 37.2C 99.5F = 37.5C
100.0F = 37.8C

マイナス側への繰り返しをする

stepメソッドでは、間隔に負の値を設定すると、マイナス側へ繰り返すループを作成できます。以下のRubyスクリプトでは、初項100、公差-4の等差数列を、0になるまでnumsに格納します。

nums=[]

100.step(0,-4) do |i|
nums.push(i)
end

p nums #=> [100, 96, 92, 88, 84, 80, 76, 72, 68, 64, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0]

初期値が終了値を過ぎていたら?

前述のRubyスクリプトで、stepメソッドの間隔を4にしたとします。このように、初期値がすでに終了値を過ぎているとどうなるでしょうか?

この場合、無限ループにはならず、一回も実行されないで終了します。間隔の正負をみて、初めに初期値と終了値を比較するからです。何も実行されないため、複雑なプログラムではバグに気づきにくいので注意しましょう。

ちなみに、間隔を0とした場合はエラー(ArgumentError)となります。

nums=[]

100.step(0,4) do |i| #ここにバグ
nums.push(i)
end

p nums #=> []

stepメソッドではループ変数に任意の間隔を設定できる

Rubyにおける、stepメソッドと、upto、downto、times、forメソッドとの違いをまとめると以下のようになります。

初期値終了値間隔
step任意任意任意
upto任意任意1
downto任意任意-1
times0n-11
for(範囲演算子)任意任意(1小さい値も可)1

stepメソッドは、初期値、終了値、間隔すべてを任意の値にできます。C言語での、ループ変数を使った制御(for(i=初期値;i<=終了値;=N;i+=間隔))と同じような書き方ができます。

ただし、Rubyのstepメソッドでは、間隔の正負を間違えたとしても、最初に引数すべてから判定を行うので、無限ループになることがないという点が異なるので注意しましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related