수색…


통사론

  • loop { block } // 무한 루프

  • 조건 { block }

  • 반면에 let pattern = expr { block }

  • expr { block }의 패턴 을 위해서 // expr은 IntoIterator를 구현해야한다.

  • continue // 루프 몸체의 끝으로 점프하고, 필요하다면 새로운 반복을 시작한다.

  • break // 루프를 멈춘다.

  • ' label : loop { block }

  • ' label : while 조건 { block }

  • ' label : while let pattern = expr { 블록 }

  • ' label : expr의 패턴 용 { block }

  • 필요한 경우 루프 본문 표시된 라벨의 마지막에 '라벨 // 점프를 계속 새로운 반복을 시작

  • break ' label // 레이블이 붙은 루프를 멈 춥니 다.

기초

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 루프

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 and IntoIterator 의 공식 문서를 참조하십시오.

참조 : Iterators

For 루프에 대한 추가 정보

Basics에서 언급했듯이 for 루프를 사용하여 IntoIterator 를 구현하는 모든 것을 사용할 수 있습니다.

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 는 또한 &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 유형입니다.

루프 제어

모든 반복 구문을 사용하면 breakcontinue 문을 사용할 수 있습니다. 그것들은 바로 둘러싼 (가장 안쪽의) 루프에 영향을 미칩니다.

기본 루프 제어

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 , 내부 루프는 한 번 반복하고, -- 인쇄되지 않았다.


참고 : 루프 변수와 평생 변수를 혼동하지 마십시오. 평생 변수 만 옆 발생 & 내부 또는 일반적인 파라미터로서 <> .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow