Rust 에서 List 에 fmt::Display 구현하기

Beginner

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

소개

이 랩에서는 Rust 에서 Vec을 포함하는 List 구조체에 대해 fmt::Display를 구현합니다. 과제는 write! 매크로를 사용하여 각 요소를 순차적으로 처리하는 것입니다. 이 매크로는 fmt::Result를 생성하며, 이를 적절하게 처리해야 합니다. 이를 위해 ? 연산자를 사용하여 write!가 오류를 반환하는지 확인하고, 오류가 발생하면 반환하고, 그렇지 않으면 실행을 계속할 수 있습니다. List에 대해 fmt::Display를 구현함으로써, 벡터의 요소를 반복하고 쉼표로 구분된 대괄호 안에 인쇄할 수 있습니다. 이 과제는 프로그램을 수정하여 벡터의 각 요소의 인덱스도 인쇄하도록 하는 것입니다. 수정 후 예상 출력은 [0: 1, 1: 2, 2: 3]입니다.

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

테스트 케이스: List

요소가 각각 순차적으로 처리되어야 하는 구조체에 대해 fmt::Display를 구현하는 것은 까다롭습니다. 문제는 각 write!fmt::Result를 생성한다는 것입니다. 이를 제대로 처리하려면 모든 결과를 처리해야 합니다. Rust 는 정확히 이러한 목적으로 ? 연산자를 제공합니다.

write!?를 사용하는 것은 다음과 같습니다.

// Try `write!` to see if it errors. If it errors, return
// the error. Otherwise continue.
write!(f, "{}", value)?;

?를 사용할 수 있으므로, Vec에 대해 fmt::Display를 구현하는 것은 간단합니다.

use std::fmt; // `fmt` 모듈을 가져옵니다.

// `Vec` 을 포함하는 `List` 라는 구조체를 정의합니다.
struct List(Vec<i32>);

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 튜플 인덱싱을 사용하여 값을 추출하고,
        // `vec` 에 대한 참조를 생성합니다.
        let vec = &self.0;

        write!(f, "[")?;

        // `count` 에서 반복 횟수를 열거하면서 `vec` 에서 `v` 를 반복합니다.
        for (count, v) in vec.iter().enumerate() {
            // 첫 번째 요소를 제외한 모든 요소에 쉼표를 추가합니다.
            // 오류 발생 시 `?` 연산자를 사용하여 반환합니다.
            if count != 0 { write!(f, ", ")?; }
            write!(f, "{}", v)?;
        }

        // 열린 대괄호를 닫고 fmt::Result 값을 반환합니다.
        write!(f, "]")
    }
}

fn main() {
    let v = List(vec![1, 2, 3]);
    println!("{}", v);
}

활동

벡터의 각 요소의 인덱스도 인쇄되도록 프로그램을 변경해 보세요. 새로운 출력은 다음과 같아야 합니다.

[0: 1, 1: 2, 2: 3]

요약

축하합니다! Testcase: List 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.