サーチ…
構文
ループ{ ブロック } //無限ループ
条件 { ブロック }
while let pattern = expr { ブロック }
式expr { ブロック } // expr中のパターンのためIntoIteratorを実装する必要があります
continue //ループ本体の最後にジャンプし、必要に応じて新しい繰り返しを開始します。
break //ループを停止する
' label :loop { block }
' ラベル :while 条件 { ブロック }
' label :while let pattern = expr { ブロック }
' label : exprの パターン用{ block }
必要に応じて、ループ本体ラベルラベルの末尾に「 ラベル //ジャンプを続け、新しい反復を開始
ブレーク" ラベル //ループラベルされたラベルを停止
基本
Rustには4つのループ構造があります。以下の例はすべて同じ出力を生成します。
無限ループ
let mut x = 0;
loop {
if x > 3 { break; }
println!("{}", x);
x += 1;
}
Whileループ
let mut x = 0;
while x <= 3 {
println!("{}", x);
x += 1;
}
また、以下を参照してください との違いは何ですかloop
とwhile true
?
パターンマッチしたWhileループ
これらは時に簡潔にするためにループを作っているものとして知られてwhile let
ます。
let mut x = Some(0);
while let Some(v) = x {
println!("{}", v);
x = if v < 3 { Some(v + 1) }
else { None };
}
これは、 loop
ブロック内のmatch
と同じです。
let mut x = Some(0);
loop {
match x {
Some(v) => {
println!("{}", v);
x = if v < 3 { Some(v + 1) }
else { None };
}
_ => break,
}
}
For Loops
Rustでは、 for
ループは "iterable"オブジェクトでのみ使用できます(つまり、 IntoIterator
を実装する必要があります)。
for x in 0..4 {
println!("{}", x);
}
これはwhile let
関わる以下のスニペットに相当します:
let mut iter = (0..4).into_iter();
while let Some(v) = iter.next() {
println!("{}", v);
}
注: 0..4
は、 Iterator
特性を既に実装しているRange
オブジェクトを返します。したがって、 into_iter()
は不要ですが、 for
が何for
するかを説明するだけです。詳しくは、 for
LoopsとIntoIterator
公式ドキュメントを参照してください。
参照: イテレータ
Forループの詳細
基本で述べたように、 IntoIterator
を実装するものはfor
ループで使用できます。
let vector = vec!["foo", "bar", "baz"]; // vectors implement IntoIterator
for val in vector {
println!("{}", val);
}
期待される出力:
foo
bar
baz
このようにvector
を反復処理すると、それを消費することに注意してください( for
ループの後、 vector
は再び使用できません)。これは、 IntoIterator::into_iter
が self
移動するためIntoIterator::into_iter
。
IntoIterator
は、 &Vec<T>
と&mut Vec<T>
(それぞれ&T
と&mut T
型を持つ値を生成する)で実装されているので、単に参照渡しするだけでvector
の移動を防ぐことができます:
let vector = vec!["foo", "bar", "baz"];
for val in &vector {
println!("{}", val);
}
println!("{:?}", vector);
vector
はVec<&str>
型であるため、 val
は&&str
型であることに注意してください。
ループ制御
すべてのループ構成では、 break
文とcontinue
文を使用できます。それらは直近の(最も内側の)ループに影響します。
基本ループ制御
break
はループを終了します:
for x in 0..5 {
if x > 2 { break; }
println!("{}", x);
}
出力0
1
2
continue
早期終了に現在の反復を
for x in 0..5 {
if x < 2 { continue; }
println!("{}", x);
}
出力2
3
4
高度なループコントロール
今、私たちはネストされたループを持っているとするとしますbreak
外側のループに出て。次に、ループラベルを使用して、 break
またはcontinue
適用されるループを指定することができます。次の例では、 'outer
は外側のループに与えられたラベルです。
'outer: for i in 0..4 {
for j in i..i+2 {
println!("{} {}", i, j);
if i > 1 {
continue 'outer;
}
}
println!("--");
}
出力0 0
0 1
--
1 1
1 2
--
2 2
3 3
i > 1
場合、内側のループは1回のみ反復され、 --
は印刷されませんでした。
注意:ループラベルを生涯変数と混同しないでください。生涯変数は唯一の横に発生&
以内またはジェネリックパラメータとして<>