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
結果は以下のとおりです。
こんな感じです!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 .. 9
は1〜9
の意味です。
結果は以下のとおりです。
数えることができました😆
1-3. 範囲オブジェクト
先程出てきた1 .. 9
は1〜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などに出てきたdo
とend
を使って書き換えることもできます!
オブジェクト.each do |変数|
実行する処理1
実行する処理2
end
指定したオブジェクトの要素を順番に取り出して(厳密にはsuccを使っています)、変数に代入し処理を実行します。これを要素が無くなるまで行います。
書き方は異なりますが、使い道はfor文に似ていますね😊
実際に書いてみます!
gist.github.com
結果は以下のとおりです。
なお、最初のオブジェクトの部分には、直接範囲オプジェクトを書く(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
メソッドと同様に、do
とend
を使って書き換えることもできます!
オブジェクト.times do |変数|
実行する処理1
実行する処理2
end
実際にやってみるのは、残りの2つの解説のあとにまとめてやります😊
ふたつめ、upto
メソッドです。これはオブジェクトの数値からmax
までの値を1ずつ増加させて順番に代入しながら実行します。
max
の部分には、max
という文字ではなく具体的な数値が入ります。
オブジェクト.upto(max){|変数|
実行する処理1
実行する処理2
}
これもdo
とend
を使って書き換えることができます。
オブジェクト.upto(max) do |変数|
実行する処理1
実行する処理2
end
みっつめ、downto
メソッドです。upto
メソッドの逆で、 オブジェクトの数値からmin
までの値を1ずつ減少させて順番に代入しながら実行します。
オブジェクト.downto(min){|変数|
実行する処理1
実行する処理2
}
これもupto
メソッドと同様にdo
とend
を使って書き換えることができます。
さて、3つまとめて実際にやってみます!
gist.github.com
これらの結果は以下のとおりになります😊
この3つはIngeter(整数)クラスのメソッドなので、整数が使えます。というか、整数しか使わないと思います笑
1-6. stepメソッド
今度はstep
メソッドです!今までは整数を1ずつ増減させながら順番に代入していきましたが、今度は浮動小数点数も使えます。
書き方は以下のとおりです。(do
とend
を使って書き換えることも可能です)
オブジェクト.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
結果は以下のとおりです。
0.5ずつ増加させることができました😆😆
1-7. loopメソッド、break
loop
メソッドはその名のとおり、ループを作ります。つまりずっと繰り返します笑
書き方は以下のとおりです。
loop{
実行する処理1
実行する処理2
}
すごく分かりやすいですね。{ }
の中をずっと繰り返します。
でもこれだと終われないので、プログラムが終わるために必要な処理を{ }
内に書くことになります。
具体的には、if文などでループを終わる条件を指定し、条件を満たす時の処理にbreak
というものを入れて、ループを抜け出すポイントを作ります。
実際に、ループ10回で抜け出すプログラムを書いてみます。
gist.github.com
結果は以下のとおりです。
このbreak
はloop
メソッドに限らず、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
に移ります。結果は以下のとおりです。
1-9. redo
またbreak
やnext
に似ていますが、redo
は改めて同じ値で処理を行うプログラムです。
なので、例えば以下のプログラムの場合、countが3の倍数(例えば3)のときにもう1度同じ値を代入して処理を実行し直されます。
この場合、代入される値が同じでも、count自体は4に進むので、代入値とcountはどんどんずれていきます。
gist.github.com
結果は以下のとおりです。
1-10. while修飾子、until修飾子
本記事の始めに扱ったwhileとuntilには、if修飾子のように式修飾子があります!
if修飾子についてはこちらの記事の最後にあります。
いわゆる書き換えができます😎2つまとめて書き方を紹介します。
真の時に実行する式 while 条件式
偽の時に実行する式 until 条件式
英語の文法と同じですね〜。構造は分かりやすいのですが、プログラムで書くのはややこしくなりそうですね笑
本日は以上です!