Menu
Coddy logo textTech

関数引数としての構造体

CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 24/66。

構造体の作成と変更方法を学んだので、次に関数でそれらを使用する方法を見ていきましょう。Rustの他のデータ型と同様に、構造体のインスタンスを関数に渡したり、関数から返したりすることができます。

構造体を関数に渡すには、単に関数定義のパラメータとしてそれを含めます:

fn calculate_area(rect: Rectangle) -> i32 {
    rect.width * rect.height
}

この関数は、Rectangle構造体を引数として受け取り、i32を返します。関数内では、他の場所と同じようにドット記法を使用して構造体のフィールドにアクセスできます。

戻り値の型として構造体型を指定することで、関数から構造体を返すこともできます。

fn create_square(size: i32) -> Rectangle {
    Rectangle {
        width: size,
        height: size,
    }
}

構造体を関数と一緒に使用することで、コードがより整理され、意味のあるものになります。複数の個別のパラメータを渡す代わりに、関連するデータをまとめて、単一の明確に定義されたユニットとして渡すことができます。

challenge icon

チャレンジ

簡単

4つの入力を受け取ります:長方形の幅(整数)、長方形の高さ(整数)、正方形の一辺の長さ(整数)、および選択番号(1または2)。2つのフィールド width: i32height: i32 を持つ Rectangle 構造体を定義してください。2つの関数を作成します。1つは Rectangle を受け取りその面積を計算する関数、もう1つは一辺の長さを受け取り正方形を表す Rectangle を返す関数です。入力された選択番号に基づいて、適切な面積を計算して出力してください。

要件:

  • フィールド width: i32height: i32 を持つ Rectangle 構造体を定義する
  • Rectangle をパラメータとして受け取り、i32(面積)を返す関数 calculate_area を作成する
  • i32(一辺の長さ)をパラメータとして受け取り、幅と高さが等しい Rectangle を返す関数 create_square を作成する
  • 最初の入力を読み込み、長方形の幅として i32 に変換する
  • 2番目の入力を読み込み、長方形の高さとして i32 に変換する
  • これらの寸法で Rectangle インスタンスを作成する
  • 3番目の入力を読み込み、正方形の一辺の長さとして i32 に変換する
  • 4番目の入力を読み込み、選択肢(1または2)として i32 に変換する
  • 選択肢が1の場合:長方形の面積を計算して出力する
  • 選択肢が2の場合:create_square を使用して正方形を作成し、その面積を計算して出力する

入力:

  • 1行目:長方形の幅(整数)(例:8
  • 2行目:長方形の高さ(整数)(例:5
  • 3行目:正方形の一辺の長さ(整数)(例:6
  • 4行目:選択肢(整数、1または2)(例:1

出力:

  • 選択肢が1の場合:Rectangle area: [area]
  • 選択肢が2の場合:Square area: [area]

チートシート

構造体は、引数として関数に渡したり、関数から返したりすることができます。

構造体を関数に渡すには、それを引数として含めます。

fn calculate_area(rect: Rectangle) -> i32 {
    rect.width * rect.height
}

関数から構造体を返すには、戻り値の型として構造体の型を指定します。

fn create_square(size: i32) -> Rectangle {
    Rectangle {
        width: size,
        height: size,
    }
}

関数内では、ドット記法を使用して構造体のフィールドにアクセスします。関数で構造体を使用すると、複数の個別の引数を渡す代わりに、関連するデータをまとめてグループ化できます。

自分で試してみよう

use std::io;

// TODO: ここでRectangle構造体を定義してください


// TODO: ここでcalculate_area関数を定義してください


// TODO: ここでcreate_square関数を定義してください


fn main() {
    // 長方形の幅を読み込む
    let mut width_input = String::new();
    io::stdin().read_line(&mut width_input).expect("Failed to read line");
    let width: i32 = width_input.trim().parse().expect("Invalid input");
    
    // 長方形の高さを読み込む
    let mut height_input = String::new();
    io::stdin().read_line(&mut height_input).expect("Failed to read line");
    let height: i32 = height_input.trim().parse().expect("Invalid input");
    
    // 正方形の一辺の長さを読み込む
    let mut side_input = String::new();
    io::stdin().read_line(&mut side_input).expect("Failed to read line");
    let side: i32 = side_input.trim().parse().expect("Invalid input");
    
    // 選択肢を読み込む
    let mut choice_input = String::new();
    io::stdin().read_line(&mut choice_input).expect("Failed to read line");
    let choice: i32 = choice_input.trim().parse().expect("Invalid input");
    
    // TODO: 以下にコードを記述してください
    // Rectangleのインスタンスを作成し、選択肢を確認して、適切な面積を計算してください
    
    
    // 選択肢に基づいて結果を出力してください
    // 使用例: println!("Rectangle area: {}", area); または println!("Square area: {}", area);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン