演習: 車を作成する関数を記述する

完了

この演習では、列挙型、構造体、および関数を使用して、新車の注文を処理します。 課題は、コンパイルして実行できるようにサンプル コードを修正することです。

この演習用のサンプル コードを操作するには、次の 2 つの方法があります。

  • コードをコピーし、ローカルの開発環境で編集します。
  • 準備済みの Rust Playground 内でコードを開きます。

注意

サンプル コードで、todo! マクロを探します。 このマクロは、完了または更新する必要があるコードを示しています。

列挙型の定義

最初のタスクでは、列挙型の定義で構文の問題を修正して、コードをコンパイルします。

  1. サンプル コードの最初のブロックを開きます。

    次のコードをコピーしてローカルの開発環境で編集するか、この用意されている Rust プレイグラウンドでコードを開きます。

    // 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" 構造体のインスタンスを作成します。 新車では、関数に渡された入力引数の値を使用する必要があります。 すべての新車の走行距離はゼロです。

    ヒント

    ステートメントを型宣言 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 = ステートメントを変更しました。 このステップを完了するに当たって、このコードを簡単にします。 1 つのステートメントで、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 内で、コードを準備済みソリューションと比較することができます。