可変な構造体
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 23/66。
デフォルトでは、Rustの構造体インスタンスは不変(イミュータブル)です。一度作成すると、そのフィールドの値を変更することはできません。しかし、他の変数と同様に、宣言時にmutキーワードを追加することで、構造体インスタンスを可変(ミュータブル)にすることができます。
構造体のインスタンスを可変(mutable)として宣言すると、ドット記法を使用してそのフィールドのいずれも変更できます:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // playerが可変なので、これは動作しますmutキーワードがないと、フィールドを変更しようとするとコンパイルエラーになります。可変性は構造体インスタンス全体に適用されます。つまり、一部のフィールドを不変に保ったまま、特定のフィールドだけを可変にすることはできません。
チャレンジ
簡単プレイヤー名、初期スコア(整数)、加算するボーナススコア(整数)、および最終スコア調整値(整数)の4つの入力を受け取ります。String型のnameとi32型のscoreという2つのフィールドを持つPlayer構造体を定義してください。この構造体の可変(mutable)インスタンスを作成し、入力値を使用してスコアフィールドを複数回変更してください。
要件:
name: Stringとscore: i32のフィールドを持つPlayer構造体を定義する- 最初の入力をプレイヤー名として読み込む
- 2番目の入力を読み込み、初期スコアとして
i32に変換する - これらの値を使用して、
Player構造体の可変(mutable)インスタンスを作成する - 3番目の入力を読み込み、ボーナススコアとして
i32に変換する - ドット記法を使用して、プレイヤーの現在のスコアにボーナススコアを加算する
- 4番目の入力を読み込み、最終調整値として
i32に変換する - プレイヤーの現在のスコアに最終調整値を加算する
- 以下の形式でプレイヤー情報を出力する
入力:
- 1行目: プレイヤー名 (例:
Alice) - 2行目: 整数としての初期スコア (例:
50) - 3行目: 整数としてのボーナススコア (例:
30) - 4行目: 整数としての最終調整値 (例:
20)
出力:
- 1行目:
Player: [name] - 2行目:
Final Score: [score]
チートシート
Rustの構造体インスタンスは、デフォルトで不変(immutable)です。作成後にフィールドの値を変更するには、mutキーワードを使用してインスタンスを可変(mutable)として宣言します:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // ドット記法を使用してフィールドを変更する可変性は構造体インスタンス全体に適用されます。一部のフィールドを不変に保ったまま、特定のフィールドだけを可変にすることはできません。
自分で試してみよう
use std::io;
// TODO: ここでnameとscoreフィールドを持つPlayer構造体を定義してください
fn main() {
// プレイヤー名を読み込む
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// 初期スコアを読み込む
let mut initial_score = String::new();
io::stdin().read_line(&mut initial_score).expect("Failed to read line");
let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
// ボーナススコアを読み込む
let mut bonus = String::new();
io::stdin().read_line(&mut bonus).expect("Failed to read line");
let bonus: i32 = bonus.trim().parse().expect("Invalid number");
// 最終調整値を読み込む
let mut adjustment = String::new();
io::stdin().read_line(&mut adjustment).expect("Failed to read line");
let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
// TODO: 可変なPlayerインスタンスを作成してください
// TODO: プレイヤーのスコアにボーナススコアを加算してください
// TODO: プレイヤーのスコアに最終調整値を加算してください
// TODO: 要求された形式で出力を表示してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。