수색…
통사론
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;
}
참조 : 차이 무엇입니까 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 루프
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);
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 , 내부 루프는 한 번 반복하고, -- 인쇄되지 않았다.
참고 : 루프 변수와 평생 변수를 혼동하지 마십시오. 평생 변수 만 옆 발생 & 내부 또는 일반적인 파라미터로서 <> .