연습: 자동차를 빌드하는 함수 작성
이 연습에서는 열거형, 구조체 및 함수를 사용하여 새 자동차 주문을 처리합니다. 도전 과제는 샘플 코드를 컴파일되고 실행되도록 수정하는 것입니다.
이 연습의 샘플 코드를 작업할 때 다음 두 가지 옵션이 있습니다.
- 로컬 개발 환경에서 코드를 복사하고 편집합니다.
- 준비된 Rust Playground에서 코드를 엽니다.
참고
샘플 코드에서 todo!
매크로를 찾습니다. 이 매크로는 완료하거나 업데이트해야 하는 코드를 나타냅니다.
열거형 정의
첫 번째 작업은 열거형 정의의 구문 문제를 해결하여 코드가 컴파일되도록 하는 것입니다.
샘플 코드의 첫 번째 블록을 엽니다.
다음 코드를 복사하여 로컬 개발 환경에서 편집하거나 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; }
프로그램이 성공적으로 컴파일되도록
Transmission
열거형에서 구문 오류를 수정합니다.다음 섹션으로 진행하기 전에 코드가 컴파일되는지 확인합니다. 코드에 아직 출력이 표시되지 않고 오류 없이 컴파일되어야 합니다.
컴파일러의 경고 메시지는 무시해도 됩니다. 열거형 및 구조체 정의를 선언하고 아직 사용하지 않았기 때문에 경고가 발생한 것입니다.
구조체 인스턴스화
다음으로, car_factory
함수에 대한 코드를 추가하여 Car
구조체의 인스턴스를 만듭니다. 입력 인수의 값을 사용하여 자동차 특성을 할당합니다.
기존 코드에 다음 코드 블록을 추가합니다. 파일의 맨 위나 맨 아래에 새 코드를 추가할 수 있습니다.
// 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"); }
코드를 다시 빌드하고 컴파일되는지 확인합니다. 이번에도 경고 메시지는 무시해도 됩니다.
car
변수 선언을 완료하여 ‘Car’ 구조체의 인스턴스를 만듭니다. 새 자동차는 함수에 전달된 입력 인수의 값을 사용해야 합니다. 모든 새 자동차의 주행 거리는 0입니다.팁
문을 형식 선언
let car: Car
에서 인스턴스화let car = Car { ... }
로 변경해야 합니다.코드를 다시 빌드하고 컴파일되는지 확인합니다.
함수에서 값 반환
이제 만든 Car
구조체를 반환하도록 car_factory
함수를 업데이트합니다. 값을 반환하려면 함수 서명으로 값 형식을 선언해야 하며 함수 본문에 값이 있어야 합니다.
함수 서명을 수정하여 반환 값 형식을
Car
구조체로 선언합니다. 파일에서 다음 코드 줄을 변경합니다.fn car_factory(color: String, transmission: Transmission, convertible: bool) = todo!("Return a `Car` struct") {
팁
대/소문자 구분에 유의합니다. 코드를 아직 컴파일하지 마세요.
새로 만든 자동차를 반환하려면
Car
구조체를 인스턴스화한 문을 조정합니다.let car: Car = todo!("An instance of a `Car` struct", "Set the function return value"); }
팁
이전 섹션에서
Car
구조체의 인스턴스를 올바르게 만들도록let car: Car =
문을 변경했습니다. 이 단계를 완료하려면 이 코드를 간소화할 수 있습니다.Car
구조체를 만들고 새로 만든 자동차를 단일 문으로 반환할 수 있습니다.let
또는return
키워드를 사용할 필요가 없습니다.코드를 다시 빌드하고 오류 없이 컴파일되는지 확인합니다.
함수 호출
이제 함수를 호출하고 일부 자동차를 빌드할 준비가 되었습니다.
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); }
코드를 다시 빌드합니다. 이제 선언된 모든 항목이 사용되므로 컴파일러에서 오류나 경고를 발행시키면 안 됩니다. 다음 출력이 표시됩니다.
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에서 준비된 솔루션과 코드를 비교할 수 있습니다.