Menu
Coddy logo textTech

可変な構造体

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

デフォルトでは、Rustの構造体インスタンスは不変(イミュータブル)です。一度作成すると、そのフィールドの値を変更することはできません。しかし、他の変数と同様に、宣言時にmutキーワードを追加することで、構造体インスタンスを可変(ミュータブル)にすることができます。

構造体のインスタンスを可変(mutable)として宣言すると、ドット記法を使用してそのフィールドのいずれも変更できます:

let mut player = Player {
    name: String::from("Alice"),
    score: 0,
};

player.score = 100; // playerが可変なので、これは動作します

mutキーワードがないと、フィールドを変更しようとするとコンパイルエラーになります。可変性は構造体インスタンス全体に適用されます。つまり、一部のフィールドを不変に保ったまま、特定のフィールドだけを可変にすることはできません。

challenge icon

チャレンジ

簡単

プレイヤー名、初期スコア(整数)、加算するボーナススコア(整数)、および最終スコア調整値(整数)の4つの入力を受け取ります。String型のnamei32型のscoreという2つのフィールドを持つPlayer構造体を定義してください。この構造体の可変(mutable)インスタンスを作成し、入力値を使用してスコアフィールドを複数回変更してください。

要件:

  • name: Stringscore: 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: 要求された形式で出力を表示してください
}
quiz icon腕試し

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

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