Rustの制御フローをコントロールするための制御構文、その中でもループ処理に焦点を当てていきたいと思います。
Rustでの繰り返し処理
- 無限ループ:loop
- 特定の条件下のループ:while
- 特定の回数のループ:for
制御構文 ループ
loop
基本的な書き方
fn main() {
let mut count = 0;
loop {
count += 1;
if count > 100 {
break;
}
println!("{}", count);
};
}
loopは、何度も処理を繰り返し実行することができます。
つまり、無限ループを簡単に作成することができます。
繰り返しを抜ける場合は、breakを使用します。
breakを忘れると、意図せず無限ループとなるので注意しましょう!笑
また、loopは式であり、値を返すことが可能であるため、以下のようなコードを書くことも可能です。
fn main() {
let mut count = 0;
let result = loop {
count += 1;
if count == 100 {
break count;
}
};
println!("{}", result);
}
無限ループはwhile True
でも同じですが、ループのたびに条件を確認しないため、若干高速です。
while
基本的な書き方
fn main() {
let mut count = 0;
while count <= 100 {
println!("{}", count);
count += 1;
}
}
whileは、特定の条件を満たす場合に、処理を繰り返したい場合に使用します。
また、loop同様にbreakで繰り返し処理を抜け出すことができます。
fn main() {
let mut count = 0;
while count <= 200 {
println!("{}", count);
count += 1;
if count > 100 {
break;
}
}
}
for
forは、繰り返し処理を行う回数が決まっている場合に使用します。
Range
fn main() {
// 10回の繰り返し処理を行う
for count in 0..10 {
println!("{}", count);
}
}
数値..数値で、Range型を書くことができます。
比較として、Pythonのrangeを置いておきます。
if __name__ == '__main__':
for i in range(10):
print(i)
10回の繰り返し処理を行う場合のコードは、
以下のJavaScriptのコードと比べると、簡単に書けて便利そうですね。
for (let count = 0; count < 10; count++) {
console.log(count);
}
for-in
fn main() {
// 配列の要素数だけ繰り返し処理を行う
let numbers = [0, 1, 2, 3, 4];
for num in numbers {
println!("{}", num);
}
}
for文の中でも、breakを使用することができます。
fn main() {
// 配列の要素数だけ繰り返し処理を行う
let numbers = [0, 1, 2, 3, 4];
for num in numbers {
if num == 2 {
break;
}
println!("{}", num);
}
}
ラベル
ラベルを使って、特定の繰り返し処理を抜ける
loop、while、forには、ラベルを付けることができます。
そのラベルをbreak時に指定することで、抜け出す繰り返し処理を指定することができます。
fn main() {
'main: loop {
println!("main 1");
'sub: loop {
println!("sub 1");
break 'main;
println!("sub 2"); // 到達しない
}
println!("main 2"); // 到達しない
}
}
ラベル subのloopの中で、ラベル mainを指定してbreakしているため、sub 2
やmain 2
が表示されることはありません。
まとめ
whileで無限ループを作ろうと以下のようなコードを書くと、
以下のような warning が出たのが印象的でした!
fn main() {
while true {
println!("無限ループ");
break;
}
}
warning: denote infinite loops with `loop { ... }`
--> src/main.rs:2:5
|
2 | while true {
| ^^^^^^^^^^ help: use `loop`
|
= note: `#[warn(while_true)]` on by default
warning: 1 warning emitted
loop使いなさい、とのことです。
それぞれの特徴を理解して、適切な記法で繰り返し処理を書くことが大切ですね。
コメント