サーチ…


構文

  • ループ{ ブロック } //無限ループ

  • 条件 { ブロック }

  • while let pattern = expr { ブロック }

  • 式expr { ブロック } // expr中のパターンのためIntoIteratorを実装する必要があります

  • continue //ループ本体の最後にジャンプし、必要に応じて新しい繰り返しを開始します。

  • break //ループを停止する

  • ' label :loop { block }

  • ' ラベル :while 条件 { ブロック }

  • ' label :while let pattern = expr { ブロック }

  • ' labelexprの パターン用{ 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;
}

また、以下を参照してください との違いは何ですかloopwhile 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);

vectorVec<&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回のみ反復され、 --は印刷されませんでした。


注意:ループラベルを生涯変数と混同しないでください。生涯変数は唯一の横に発生&以内またはジェネリックパラメータとして<>



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow