どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

Ruby入門 part4

本日もRuby入門の続きです😊

目次

1.繰り返し

1-1.while文、until文

プログラムを繰り返して実行するための「while文」というものがあります!
while文は、条件式が真(true)の間、whileからendの間に書いてある処理を繰り返し実行します。

while 条件式 do
    実行する処理1
    実行する処理2
end

doは省略することもできます👌
条件式がずっとtrueだと終われないので、条件式がfalseになってwhile文から抜け出す時の流れも考えて処理を書かなきゃだめです笑
例として、一週間継続して何かやるときに毎日応援してくれるプログラムを作りました🙂
gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181113134501p:plain
こんな感じです!num += 1は、numの数字を1ずつ増やしていく「自己代入」というものでした。
参考記事:Ruby入門 part3

また、while文とそっくりなuntil文という方法でプログラムを繰り返します。
条件式がtrueの間繰り返すwhile文に対して、until文は条件式がfalseの間繰り返します。それ以外はwhile文と同じです💡
英単語のとおりで、while 条件式は「条件式がtrueである間は実行する」、until 条件式は「条件式がtrueになるまで実行する」ですね。

1-2. for文

for文は、指定したオブジェクトから順番に値を取り出しながらプログラムを繰り返します。
指定したオブジェクトとかいきなり言われても分からないので、書き方を見てみます。

for 変数 in オブジェクト do
    実行する処理1
    実行する処理2
end

ちなみにこれもdoは省略可能です。わたしは、初心者のうちは省略可能なものも省略せずに書いたほうが良いと思う派なので、書いていきますよ〜💪
あと、オプジェクトはeachメソッドを持ったオブジェクトでないといけないみたいです。
また聞き慣れない言葉ですね〜😶
eachメソッドは詳しくは後述しますが、簡単に言うと、範囲を示したり、配列を示すオブジェクトなどのことです。
難しく考えなくても、for文を使うシチュエーションというのはおのずとeachメソッドを使いたい時だろうと思うので今は頭の片隅に置いておく程度にしておきます。
例として、かくれんぼの鬼が10数えるところやってみます!
gist.github.com
後述しますが、1 .. 91〜9の意味です。
結果は以下のとおりです。
f:id:mistyrinth:20181113141348p:plain
数えることができました😆

1-3. 範囲オブジェクト

先程出てきた1 .. 91〜9を表す範囲オブジェクトです。
1 ... 9と書くと、最後の値が除かれて1〜8を意味します。
これらの範囲オブジェクトRangeクラスに属します。
newを使って同じものを表すことが出来ます。
Range.new(1,9)なら1 .. 9つまり1〜9を表します。
Range.new(1,9,true)なら1 ... 9つまり1〜8を表します。このtrueは真の値ならOKです👌

範囲オブジェクトの注意点を知る前に、succ メソッドについて少し触れます。
succメソッドは、簡単に言うとインクリメント(1増加)することです。
範囲オブジェクトの注意点と併せて、以下にいくつか例を示します。

表記 結果
1.succ 2
9.succ 10
"a".succ "b"
"z".succ "aa"
"a1" "b2"
-5.succ -4
"-5".succ "-6"

以上のような感じです。注意点は、文字列と数値それぞれインクリメントされ、その他の文字列(最後のマイナスなど)はそのまま残るというところですね。

1-4.eachメソッド

for文のときに少し出てきたeachメソッドについてです👀
順番に取り出すやつでしたね。書き方は以下のとおりです。

オブジェクト.each{|変数|
    実行する処理1
    実行する処理1
}

これはwhileなどに出てきたdoendを使って書き換えることもできます!

オブジェクト.each do |変数|
    実行する処理1
    実行する処理2
end

指定したオブジェクトの要素を順番に取り出して(厳密にはsuccを使っています)、変数に代入し処理を実行します。これを要素が無くなるまで行います。
書き方は異なりますが、使い道はfor文に似ていますね😊
実際に書いてみます!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181114131904p:plain

なお、最初のオブジェクトの部分には、直接範囲オプジェクトを書く(1 ..5).each{ 中略 }という書き方もできます。

1-5. timesメソッド、uptoメソッド、downtoメソッド

続いて、3つのメソッドを一気に紹介します💪
ひとつめ、timesメソッドです。
timesメソッドは、書き方はeachメソッド同様で、{ }の間の処理を実行します。

オブジェクト.times{|変数|
    実行する処理1
    実行する処理2
}

変数には、0から始まりオブジェクトの数値 - 1までを順番に代入しながら処理を実行します。
これも英単語の通りで、例えば英語で10 timesと言ったら「10回」ですね💡最初の0が含まれているので、0回から9回までの10回実行するということです。
変数を使わない時は|変数|の部分は省略できます🙂
また、eachメソッドと同様に、doendを使って書き換えることもできます!

オブジェクト.times do |変数|
    実行する処理1
    実行する処理2
end

実際にやってみるのは、残りの2つの解説のあとにまとめてやります😊
ふたつめ、uptoメソッドです。これはオブジェクトの数値からmaxまでの値を1ずつ増加させて順番に代入しながら実行します。
maxの部分には、maxという文字ではなく具体的な数値が入ります。

オブジェクト.upto(max){|変数|
    実行する処理1
    実行する処理2
}

これもdoendを使って書き換えることができます。

オブジェクト.upto(max) do |変数|
    実行する処理1
    実行する処理2
end

みっつめ、downtoメソッドです。uptoメソッドの逆で、 オブジェクトの数値からminまでの値を1ずつ減少させて順番に代入しながら実行します。

オブジェクト.downto(min){|変数|
    実行する処理1
    実行する処理2
}

これもuptoメソッドと同様にdoendを使って書き換えることができます。

さて、3つまとめて実際にやってみます!

gist.github.com
これらの結果は以下のとおりになります😊
f:id:mistyrinth:20181114151205p:plain

この3つはIngeter(整数)クラスのメソッドなので、整数が使えます。というか、整数しか使わないと思います笑

1-6. stepメソッド

今度はstepメソッドです!今までは整数を1ずつ増減させながら順番に代入していきましたが、今度は浮動小数点数も使えます。
書き方は以下のとおりです。(doendを使って書き換えることも可能です)

オブジェクト.step(limit, stepno){|変数|
    実行する処理1
    実行する処理2
}

limitは英単語的には限界値のことですね。stepnoでは、増加させる幅を指定できます。今まで1ずつだったのが0.5ずつとか指定できるわけですね!
つまりstepメソッドは、「オブジェクトから始まり、stepnoずつ増加させて、limitを超えない範囲で処理を実行する」ですね。limitを超えたら処理は実行されません。
stepnoを省略すると、1と見なされてずつ増加します。また、-1のように負の値も設定可能です👏<br> これはstepメソッドがNumeric(数字)クラスだからですね。Integer(整数)やFloat(浮動小数点数)はNumericのサブクラスです。<br> timesメソッドなどがInteger(整数)クラスなのに対して、step`メソッドはNumeric(数字全般)に使えるという感覚で大丈夫だと思います!

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181114160723p:plain
0.5ずつ増加させることができました😆😆

1-7. loopメソッド、break

loopメソッドはその名のとおり、ループを作ります。つまりずっと繰り返します笑 書き方は以下のとおりです。

loop{
    実行する処理1
    実行する処理2
}

すごく分かりやすいですね。{ }の中をずっと繰り返します。
でもこれだと終われないので、プログラムが終わるために必要な処理を{ }内に書くことになります。
具体的には、if文などでループを終わる条件を指定し、条件を満たす時の処理にbreakというものを入れて、ループを抜け出すポイントを作ります。
実際に、ループ10回で抜け出すプログラムを書いてみます。

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181114162759p:plain

このbreakloopメソッドに限らず、if文やfor文、eachなど繰り返し処理をする場面で扱えます。
例えばeachメソッドで繰り返しをしている途中にbreakを入れると、eachメソッドで指定した条件を終える前に繰り返しを終了します。

1-8. next

break と似たものにnextというものがあります。
breakは繰り返し処理を終了しますが、nextはループブロック{ }内のnext以降の処理を飛ばします😶
例えば、アルファベットのaからzまでの間で、3の倍数回目(3回目、6回目、9回目…)に出てくる文字だけ出力するプログラムを作りました!

gist.github.com
3の倍数ではない時にnextにより処理を飛ばし、次の値を代入に移っています。
3の倍数の時は、if文を飛ばしてprintに移ります。結果は以下のとおりです。
f:id:mistyrinth:20181114165226p:plain

1-9. redo

またbreaknextに似ていますが、redoは改めて同じ値で処理を行うプログラムです。
なので、例えば以下のプログラムの場合、countが3の倍数(例えば3)のときにもう1度同じ値を代入して処理を実行し直されます。
この場合、代入される値が同じでも、count自体は4に進むので、代入値とcountはどんどんずれていきます。

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181114184442p:plain

1-10. while修飾子、until修飾子

本記事の始めに扱ったwhileとuntilには、if修飾子のように式修飾子があります!
if修飾子についてはこちらの記事の最後にあります。
いわゆる書き換えができます😎2つまとめて書き方を紹介します。

真の時に実行する式 while 条件式
偽の時に実行する式 until 条件式

英語の文法と同じですね〜。構造は分かりやすいのですが、プログラムで書くのはややこしくなりそうですね笑

本日は以上です!