연습: 자동차를 빌드하는 함수 작성

완료됨

이 연습에서는 열거형, 구조체 및 함수를 사용하여 새 자동차 주문을 처리합니다. 도전 과제는 샘플 코드를 컴파일되고 실행되도록 수정하는 것입니다.

이 연습의 샘플 코드를 작업할 때 다음 두 가지 옵션이 있습니다.

  • 로컬 개발 환경에서 코드를 복사하고 편집합니다.
  • 준비된 Rust Playground에서 코드를 엽니다.

참고

샘플 코드에서 todo! 매크로를 찾습니다. 이 매크로는 완료하거나 업데이트해야 하는 코드를 나타냅니다.

열거형 정의

첫 번째 작업은 열거형 정의의 구문 문제를 해결하여 코드가 컴파일되도록 하는 것입니다.

  1. 샘플 코드의 첫 번째 블록을 엽니다.

    다음 코드를 복사하여 로컬 개발 환경에서 편집하거나 Rust Playground에서 코드를 엽니다.

    // Declare Car struct to describe vehicle with four named fields
    struct Car {
        color: String,
        transmission: Transmission,
        convertible: bool,
        mileage: u32,
    }
    
    #[derive(PartialEq, Debug)]
    // Declare enum for Car transmission type
    enum Transmission {
        // todo!("Fix enum definition so code compiles");
        Manual;
        SemiAuto;
        Automatic;
    }
    
  2. 프로그램이 성공적으로 컴파일되도록 Transmission 열거형에서 구문 오류를 수정합니다.

    다음 섹션으로 진행하기 전에 코드가 컴파일되는지 확인합니다. 코드에 아직 출력이 표시되지 않고 오류 없이 컴파일되어야 합니다.

    컴파일러의 경고 메시지는 무시해도 됩니다. 열거형 및 구조체 정의를 선언하고 아직 사용하지 않았기 때문에 경고가 발생한 것입니다.

구조체 인스턴스화

다음으로, car_factory 함수에 대한 코드를 추가하여 Car 구조체의 인스턴스를 만듭니다. 입력 인수의 값을 사용하여 자동차 특성을 할당합니다.

  1. 기존 코드에 다음 코드 블록을 추가합니다. 파일의 맨 위나 맨 아래에 새 코드를 추가할 수 있습니다.

    // Build a "Car" by using values from the input arguments
    // - Color of car (String)
    // - Transmission type (enum value)
    // - Convertible (boolean, true if car is a convertible)
    fn car_factory(color: String, transmission: Transmission, convertible: bool) {
    
        // Use the values of the input arguments
        // All new cars always have zero mileage
        let car: Car = todo!("Create an instance of a `Car` struct");
    }
    
  2. 코드를 다시 빌드하고 컴파일되는지 확인합니다. 이번에도 경고 메시지는 무시해도 됩니다.

  3. car 변수 선언을 완료하여 ‘Car’ 구조체의 인스턴스를 만듭니다. 새 자동차는 함수에 전달된 입력 인수의 값을 사용해야 합니다. 모든 새 자동차의 주행 거리는 0입니다.

    문을 형식 선언 let car: Car에서 인스턴스화 let car = Car { ... }로 변경해야 합니다.

  4. 코드를 다시 빌드하고 컴파일되는지 확인합니다.

함수에서 값 반환

이제 만든 Car 구조체를 반환하도록 car_factory 함수를 업데이트합니다. 값을 반환하려면 함수 서명으로 값 형식을 선언해야 하며 함수 본문에 값이 있어야 합니다.

  1. 함수 서명을 수정하여 반환 값 형식을 Car 구조체로 선언합니다. 파일에서 다음 코드 줄을 변경합니다.

    fn car_factory(color: String, transmission: Transmission, convertible: bool) = todo!("Return a `Car` struct") {
    

    대/소문자 구분에 유의합니다. 코드를 아직 컴파일하지 마세요.

  2. 새로 만든 자동차를 반환하려면 Car 구조체를 인스턴스화한 문을 조정합니다.

        let car: Car = todo!("An instance of a `Car` struct", "Set the function return value");
    }
    

    이전 섹션에서 Car 구조체의 인스턴스를 올바르게 만들도록 let car: Car = 문을 변경했습니다. 이 단계를 완료하려면 이 코드를 간소화할 수 있습니다. Car 구조체를 만들고 새로 만든 자동차를 단일 문으로 반환할 수 있습니다. let 또는 return 키워드를 사용할 필요가 없습니다.

  3. 코드를 다시 빌드하고 오류 없이 컴파일되는지 확인합니다.

함수 호출

이제 함수를 호출하고 일부 자동차를 빌드할 준비가 되었습니다.

  1. main 함수를 기존 코드에 추가합니다. 파일의 맨 위나 맨 아래에 새 코드를 추가할 수 있습니다.

    fn main() {
        // We have orders for three new cars!
        // We'll declare a mutable car variable and reuse it for all the cars
        let mut car = car_factory(String::from("Red"), Transmission::Manual, false);
        println!("Car 1 = {}, {:?} transmission, convertible: {}, mileage: {}", car.color, car.transmission, car.convertible, car.mileage);
    
        car = car_factory(String::from("Silver"), Transmission::Automatic, true);
        println!("Car 2 = {}, {:?} transmission, convertible: {}, mileage: {}", car.color, car.transmission, car.convertible, car.mileage);
    
        car = car_factory(String::from("Yellow"), Transmission::SemiAuto, false);
        println!("Car 3 = {}, {:?} transmission, convertible: {}, mileage: {}", car.color, car.transmission, car.convertible, car.mileage);    
    }
    
  2. 코드를 다시 빌드합니다. 이제 선언된 모든 항목이 사용되므로 컴파일러에서 오류나 경고를 발행시키면 안 됩니다. 다음 출력이 표시됩니다.

    Car 1 = Red, Manual transmission, convertible: false, mileage: 0
    Car 2 = Silver, Automatic transmission, convertible: true, mileage: 0
    Car 3 = Yellow, SemiAuto transmission, convertible: false, mileage: 0
    

솔루션

Rust Playground에서 준비된 솔루션과 코드를 비교할 수 있습니다.