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