모든 반복자는 지연 특성이 있으므로 반복자 어댑터를 호출한 후의 결과를 얻으려면 소비 어댑터 메서드 중 하나를 호출해야 한다.
각 아이템에 대해 인수로 전달된 클로저를 호출하는 반복자 어댑터 메서드인 map 메서드의 사용법
fn run_test1(test_case: &[i32]) {
// 반복자 어댑터만 호출하고 소비 어댑터는 호출되지 않아서 아무런 작업도 수행하지 않는다.
test_case.iter().map(|x| x + 1);
}
fn run_test2(test_case: &[i32]) {
// 반복자 어댑터 map이 for문 안이라서 소비된다.
for item in test_case.iter().map(|x| x + 1) {
println!("{}", item);
}
}
fn run_test3(test_case: &[i32]) {
// 소비자 어댑터인 collect를 호출하기에 계산된 결과를 반환한다.
let v: Vec<_> = test_case.iter().map(|x| x + 1).collect();
assert_eq!(v, vec![2, 3, 4]);
}
fn main() {
run_test1(&[1, 2, 3]);
run_test2(&[1, 2, 3]);
run_test3(&[1, 2, 3]);
}
for문 자체가 소유권을 가져오는 특성이 있어 주의가 필요하다.
fn main() {
let aa = vec![1, 2, 3];
for item in aa {
println!("{}", item);
}
for item in aa { // error, 소유권 이동
println!("{}", item);
}
}
만약 for문에 소유권을 전달하고 싶지 않다면 참조로 전달 해야한다.
fn main() {
let aa = vec![1, 2, 3];
for item in &aa { // 참조
println!("{}", item);
}
for item in aa { // OK
println!("{}", item);
}
}
zip 메서드는 두개의 컨테이너를 바인딩 해준다.
fn main() {
for (x, y) in (0..10).zip(5..10) {
println!("{}, {}", x, y);
}
}
0, 5
1, 6
2, 7
3, 8
4, 9
중첩되어 있는 반복문에서 모두 탈출하기 위해 더 이상 flag 변소를 만들 필요가 없다
레이블을 사용하여 탈출할 for문을 지정할 수 있다.(goto 문 비슷)
fn main() {
'outer: for x in 0.. {
for y in 0.. {
for z in 0.. {
println!("{}, {}, {}", x, y, z);
if x + y + z > 5 {
break 'outer;
}
}
}
}
}