関数引数としての構造体
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,
}
}構造体を関数と一緒に使用することで、コードがより整理され、意味のあるものになります。複数の個別のパラメータを渡す代わりに、関連するデータをまとめて、単一の明確に定義されたユニットとして渡すことができます。
チャレンジ
簡単4つの入力を受け取ります:長方形の幅(整数)、長方形の高さ(整数)、正方形の一辺の長さ(整数)、および選択番号(1または2)。2つのフィールド width: i32 と height: i32 を持つ Rectangle 構造体を定義してください。2つの関数を作成します。1つは Rectangle を受け取りその面積を計算する関数、もう1つは一辺の長さを受け取り正方形を表す Rectangle を返す関数です。入力された選択番号に基づいて、適切な面積を計算して出力してください。
要件:
- フィールド
width: i32とheight: 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);
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。