Progrust Library.

// dictionary

構造体更新記法.

構造体更新記法(..base)は、既存の構造体のインスタンス(base)から値を流用して新しいインスタンスを作る記法です。明示的に指定したフィールドには新しい値が使われ、指定しなかった残りのフィールドはbaseから引き継がれます。全フィールドを毎回書き並べずに、一部だけ異なるインスタンスを簡潔に作れます。

struct User {
    name: String,
    age: u32,
    active: bool,
}

fn main() {
    let user1 = User {
        name: String::from("田中"),
        age: 28,
        active: true,
    };

    // name と active は user1 の値を流用し、age だけ上書き
    let user2 = User {
        age: 29,
        ..user1
    };

    println!("{}さん({}歳)", user2.name, user2.age);
}
Playgroundで開く

所有権への影響

..baseで引き継がれるフィールドは、所有権の観点ではムーブと同じ規則に従います。フィールドの型によって、base側がその後も使えるかどうかが変わります。

baseのフィールド型 ..baseでの挙動 base側のその後
Copy実装あり(例: u32 コピー フィールド単体は引き続き使用可
Copy未実装(例: String ムーブ 使用不可
struct User {
    name: String,
    age: u32,
}

fn main() {
    let user1 = User { name: String::from("田中"), age: 28 };
    let user2 = User { age: 29, ..user1 }; // name(非Copy型)が user1 からムーブ

    println!("{}", user2.name);
    println!("{}", user1.name); // エラー: E0382(ムーブ済みフィールドの使用)
}
Playgroundで開く

この辞書が使われているページ

backlinks 2

  1. 辞書構造体
  2. 動かして学ぶRustプログラミング問題集 › 第9章 構造体