Rustのwhile文、使ってみたいけど、どう書けばいいのか、どんな時に使うのか、イマイチよくわからない…なんて悩んでいませんか?
プログラミングで繰り返し処理は必須テクニックですが、Rustには他にもループの方法があって、どれを使えばいいか迷うこともありますよね。
この記事では、Rustのwhileループについて、基本のキからしっかり解説していきます! サンプルコードもたくさん用意したので、実際に動かしながら学べますよ。
この記事で学べること
- Rustのwhile文の基本的な考え方
- while文の具体的な書き方(構文)
- サンプルコードで学ぶwhile文の使い方
- ループを抜けたりスキップしたりする方法(breakとcontinue)
- while文を使うときの注意点(無限ループとか!)
- 他のループ(loopやfor)との使い分けのヒント
Rustのwhileとは?基本的な役割を理解しよう
プログラミングをしていると、「この条件が満たされている間、ずっと同じ処理を繰り返したいな〜」という場面がよくあります。
例えば、ゲームでHPが0になるまで敵に攻撃を続けるとか、ダウンロードが終わるまで待機するとか。そんな時に活躍するのがループ処理です。
そして、特定の「条件」が成り立っている間だけ処理を繰り返す、というのがwhile
文の基本的な役割です。「お湯が沸く(条件)まで、火にかける(処理を繰り返す)」みたいなイメージですね。
条件が成り立たなくなったら、ループは自動的にストップします。シンプルで分かりやすいでしょう? Rustにももちろん、この便利なwhile
文が用意されています。
条件チェック → True → 処理実行 → 条件チェック ... ↓ False ループ終了
Rustのwhileの基本的な書き方
じゃあ、実際にRustでwhile
文はどう書くのでしょうか? 書き方はとっても簡単! 基本的な形はこうなっています。
while 条件式 { // 条件式が true の間、繰り返したい処理を書く場所 // 例: println!("ループ中!"); }
ポイントを分解してみましょう。
while
これは「これからwhile文を始めますよ」という合図のキーワードです。条件式
ループを続けるかどうかを判断するための式を書きます。この式の結果がtrue
(真)の間、ループは続きます。false
(偽)になったらループは終わります。ここは必ずtrue
かfalse
を返す式(bool
値)にしてくださいね。{ }
波括弧で囲まれた部分が、繰り返し実行される処理ブロックです。この中に、ループさせたい処理をいくつでも書けます。
例えば、while true { ... }
と書くと、条件式が常にtrue
なので、無限にループし続けます(止める方法も後で説明しますよ!)。
Rustのwhileの使い方
基本的な書き方がわかったところで、ここからは実際にwhile
文を使ったコードを見ていきましょう! 百聞は一見にしかず、コードを動かしてみるのが一番の近道です。
カウンター変数を使った基本的なwhileループ
まずは、一番オーソドックスな使い方から。while
文とカウンター変数(数を数えるための変数)を組み合わせて、決まった回数だけ処理を繰り返してみましょう。
ここでは、1から5まで数えて表示するプログラムを作ります。
fn main() { let mut count = 1; // 数を数えるための変数を用意(変更するので mut が必要) println!("カウント開始!"); while count <= 5 { // count が 5 以下である間、ループを続ける println!("現在のカウント: {}", count); count += 1; // count に 1 を足す(重要!) } println!("カウント終了!"); }
表示結果
カウント開始! 現在のカウント: 1 現在のカウント: 2 現在のカウント: 3 現在のカウント: 4 現在のカウント: 5 カウント終了!
解説
- 最初に
let mut count = 1;
で、カウンター変数count
を1で初期化しています。ループの中で値を変えるのでmut
が必要です。 while count <= 5
で、「count
が5以下の間」という条件を設定しています。- ループの中では、まず
println!
で現在のcount
の値を表示します。 - 次に
count += 1;
でcount
の値を1増やします。ここが超重要!もしこの行がないと、count
はずっと1のままなので、条件式count <= 5
が永遠にtrue
になり、無限ループになってしまいます。 count
が6になった時点で条件式count <= 5
がfalse
になり、ループが終了します。- 最後に「カウント終了!」と表示されます。
`break`でwhileループを抜ける方法
ループ処理をしていると、「条件はまだ満たされているけど、ある特別なことが起きたらループをすぐにやめたい!」という時があります。
そんな時に使うのがbreak
です。break
を使うと、その時点で強制的にループから抜け出すことができます。
例えば、1から数え始めて、3になったらもう数えるのをやめる、という処理を書いてみましょう。
fn main() { let mut number = 0; while number < 10 { // 本来なら9まで数えるはずだけど... number += 1; println!("現在の数字: {}", number); if number == 3 { println!("おっと、3になったのでループを脱出します!"); break; // ここでループを強制終了! } } println!("ループが終了しました。最終的な数字: {}", number); }
表示結果
現在の数字: 1 現在の数字: 2 現在の数字: 3 おっと、3になったのでループを脱出します! ループが終了しました。最終的な数字: 3
解説
ループの条件はnumber < 10
なので、普通ならnumber
が9になるまで繰り返されるはずです。
しかし、ループの中でif number == 3
という条件をチェックしています。
number
が3になった時、このif
文の中のbreak;
が実行されます。
break;
が実行されると、ループの強制終了が行われ、while
ループの直後にあるprintln!
の行に処理が移ります。結果として、4以降は表示されずにループが終わりました。
`continue`で処理をスキップして次の繰り返しへ進む方法
今度は、ループを途中で抜け出すのではなく、「今回はこの処理を飛ばして、次の繰り返しに進みたいな」という場合です。
そんな時に便利なのがcontinue
です。continue
を使うと、ループ内のそれ以降の処理をスキップして、すぐに次のループの条件判定に移ります。
例として、1から5まで数えるけど、3の時だけ表示をスキップする、という処理を見てみましょう。
fn main() { let mut number = 0; while number < 5 { number += 1; if number == 3 { println!("(3はスキップします)"); continue; // これ以降の処理を飛ばして、次のループ(numberが4の場合)へ } // numberが3の時は、この行は実行されない println!("現在の数字: {}", number); } println!("ループ終了!"); }
表示結果
現在の数字: 1 現在の数字: 2 (3はスキップします) 現在の数字: 4 現在の数字: 5 ループ終了!
解説
ループの中でnumber
を1増やした後、if number == 3
をチェックしています。
number
が3になった時、println!
でスキップすることを表示してからcontinue;
が実行されます。
continue;
が実行されると、その下にあるprintln!("現在の数字: {}", number);
は実行されずに、次の繰り返しへジャンプします。つまり、すぐに次のwhile number < 5
の条件判定(この時点ではnumber
は3なので次は4の判定へ)に進むわけです。
結果として、3だけが表示されませんでした。break
(ループ終了)とcontinue
(今回の処理だけスキップ)の違い、しっかり掴んでおきましょう。
Rustのwhileを使う上での注意点
while
文はシンプルで便利ですが、使う上でいくつか気をつけておきたい点があります。うっかりミスを防いで、より良いコードを書くために知っておきましょう。
無限ループに注意!
先ほど少し触れましたが、while
文で最も注意したいのが「無限ループ」です。これは、ループの条件式がいつまで経ってもfalse
にならず、プログラムが終わらなくなってしまう状態のこと。
無限ループが起こる主な原因は以下の二つです。
- 条件式が常に
true
になってしまう。
例:while 1 < 2 { ... }
(1は常に2より小さい) - ループの中で条件式に関わる変数を更新し忘れている。
例: カウンターを使ったループでcount += 1;
を書き忘れる(先ほどの例)。
意図しない無限ループは、プログラムがフリーズしたり、CPUを無駄に消費したりする原因になります。条件式のチェックと、ループ内で条件に関わる変数がちゃんと変化していくかの確認はしっかり行いましょう。
もちろん、意図的に無限ループを作って、break
で脱出するという書き方もできます。Rustにはそのためのloop
構文もありますが、while true { ... if 条件 { break; } }
のように書くことも可能です。
Rustにおける`loop`や`for`との使い分け
Rustにはwhile
以外にも、繰り返し処理を行うための構文としてloop
とfor
があります。それぞれの特徴を知って、場面に応じて使い分けるのが、Rustらしいコードを書くコツです。
loop
- これは最初から無限ループを作るための構文です。
loop { ... }
のように書きます。- 必ずループ内のどこかで
break
を使って脱出する必要があります(そうしないと本当に無限ループ!)。 - 「とりあえず無限ループさせておいて、特定の条件で抜け出す」という場合に明示的に使われます。
for
- 配列やベクタ、範囲(例:
1..5
は1から4まで)など、「イテレータ」と呼ばれる「連続したデータ」の要素を順番に取り出して処理するのに特化したループです。 for item in collection { ... }
のように書きます。- カウンター変数を自分で用意したり、インクリメントしたりする必要がなく、安全で簡潔に書けることが多いです。
- Rustではコレクション(配列など)の要素を順番に処理する場合は、
for
ループを使うのが一般的で推奨されています。
- 配列やベクタ、範囲(例:
while
- 「特定の条件が満たされている間」繰り返す、という場合に適しています。
- ループの継続条件が、回数ではなく、何らかの状態(例: ファイルの終端に達していない、エラーが発生していないなど)に基づいている場合に特に有効です。
- カウンター変数を使ったループも書けますが、
for
で書けるならそちらの方がRustらしいことが多いです。
というわけで、適切なループを選ぶことが大切です。コレクションの要素を扱うならfor
、無限ループが基本ならloop
、そして条件ベースの繰り返しならwhile
、という使い分けを意識してみてください。
【まとめ】Rustのwhileを理解して活用しよう!
お疲れ様でした! 今回はRustのwhile
文について、基本的なことから応用的な使い方、注意点まで見てきました。
今回のポイントをまとめておきましょう。
while
文は「条件式がtrue
の間」処理を繰り返す。- 書き方は
while 条件式 { 処理 }
。 break
でループを途中で抜けられる。continue
で現在の処理をスキップして次に進める。- 条件式や変数の更新忘れによる「無限ループ」には要注意!
- Rustには
loop
やfor
もあり、場面によって使い分けるのが◎。
while
文は、条件に基づいて繰り返し処理を行いたいときに非常に役立つ構文です。今回の内容を参考に、ぜひあなたのRustプログラムでも活用してみてくださいね!
プログラミングは書いて動かして、試行錯誤するのが上達への一番の道です。どんどんコードを書いて、Rustと仲良くなっていきましょう!
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。