Rust 반복문과 범위

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 Rust 에서 for 루프와 범위 (range) 를 사용하는 방법을 배웁니다. for 루프와 함께 range 표기법 a..b를 사용하여 값의 범위를 반복할 수 있습니다. 예를 들어, while 루프 대신 for 루프를 사용하여 FizzBuzz 프로그램을 작성할 수 있습니다. 또한 양쪽 끝을 포함하는 범위를 위해 ..= 표기법을 사용할 수 있습니다. for 루프는 iter를 사용하여 컬렉션의 각 요소를 빌려오거나, into_iter를 사용하여 컬렉션을 소비하거나, iter_mut를 사용하여 컬렉션의 각 요소를 가변적으로 빌려오는 등 다양한 방식으로 반복자 (iterator) 와 상호 작용할 수 있습니다. 이러한 각 방법은 컬렉션 내 데이터의 다른 뷰를 제공하여 서로 다른 작업을 수행할 수 있도록 합니다.

참고: 실습에서 파일 이름을 지정하지 않으면 원하는 파일 이름을 사용할 수 있습니다. 예를 들어 main.rs를 사용하고 rustc main.rs && ./main으로 컴파일 및 실행할 수 있습니다.

for 루프

for 와 범위

for in 구문은 Iterator를 반복하는 데 사용될 수 있습니다. 반복자를 만드는 가장 쉬운 방법 중 하나는 범위 표기법 a..b를 사용하는 것입니다. 이것은 a (포함) 에서 b (제외) 까지 1 씩 증가하는 값을 생성합니다.

while 대신 for를 사용하여 FizzBuzz 를 작성해 보겠습니다.

fn main() {
    // `n` 은 각 반복에서 1, 2, ..., 100 의 값을 가집니다.
    for n in 1..101 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

또는 양쪽 끝을 포함하는 범위를 위해 a..=b를 사용할 수 있습니다. 위의 코드는 다음과 같이 작성할 수 있습니다.

fn main() {
    // `n` 은 각 반복에서 1, 2, ..., 100 의 값을 가집니다.
    for n in 1..=100 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

for 와 반복자

for in 구문은 여러 가지 방법으로 Iterator와 상호 작용할 수 있습니다. 반복자 트레이트에 대한 섹션에서 논의했듯이, 기본적으로 for 루프는 컬렉션에 into_iter 함수를 적용합니다. 그러나 이것이 컬렉션을 반복자로 변환하는 유일한 방법은 아닙니다.

into_iter, iteriter_mut는 컬렉션을 반복자로 변환하는 방식이 다르며, 데이터에 대한 다른 뷰를 제공합니다.

  • iter - 이것은 각 반복에서 컬렉션의 각 요소를 빌려옵니다. 따라서 루프 후에도 컬렉션은 변경되지 않고 재사용할 수 있습니다.
fn main() {
    let names = vec!["Bob", "Frank", "Ferris"];

    for name in names.iter() {
        match name {
            &"Ferris" => println!("There is a rustacean among us!"),
            // TODO ^ &를 삭제하고 "Ferris"만 일치시켜보세요.
            _ => println!("Hello {}", name),
        }
    }

    println!("names: {:?}", names);
}
  • into_iter - 이것은 컬렉션을 소비하므로 각 반복에서 정확한 데이터가 제공됩니다. 컬렉션이 소비되면 루프 내에서 '이동'되었기 때문에 재사용할 수 없습니다.
fn main() {
    let names = vec!["Bob", "Frank", "Ferris"];

    for name in names.into_iter() {
        match name {
            "Ferris" => println!("There is a rustacean among us!"),
            _ => println!("Hello {}", name),
        }
    }

    println!("names: {:?}", names);
    // FIXME ^ 이 줄을 주석 처리하세요.
}
  • iter_mut - 이것은 컬렉션의 각 요소를 가변적으로 빌려와서 컬렉션을 자리에서 수정할 수 있도록 합니다.
fn main() {
    let mut names = vec!["Bob", "Frank", "Ferris"];

    for name in names.iter_mut() {
        *name = match name {
            &mut "Ferris" => "There is a rustacean among us!",
            _ => "Hello",
        }
    }

    println!("names: {:?}", names);
}

위의 코드 조각에서 match 분기의 유형에 유의하십시오. 이것이 반복 유형의 주요 차이점입니다. 유형의 차이로 인해 수행할 수 있는 작업이 달라집니다.

요약

축하합니다! For 루프 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.