// 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