変数代入時のsemantics
2つのsemanticsがある
move semantics
copy semantics
同じsyntaxなのに、意味(挙動)が異なるので、これはsemanticsの話
同じlet p2 = p1というsyntaxでも
moveされたり、copyされたり、意味(挙動)が変わる
p1がCopy traitを実装しているかどうかで変わる
move semantics
code:rs
#derive(Debug)
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1; // 所有権がp1からp2にmove
println!("{:?}", p2); // OK: p2は所有権を持っている
println!("{:?}", p1); // NG: p1はムーブされたため使用できない
}
copy semantics
code:rs
#derive(Debug, Copy, Clone) // Copyを実装
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1; // (moveではなく)値のコピーが発生
println!("{:?}", p1); // OK: p1はまだ有効 (所有権は失われない)
println!("{:?}", p2); // OK: p2はp1のコピー
}
/mrsekut-book-4297105594/281
/mrsekut-book-4873118557/111 (4.3 コピー型:移動の例外)