ownershipを移動したりしなかったりする3パターン
値を扱う際に、ownerを気にするやつは3パターン
move
copy
borrow
また、moveとcopyは、syntaxは同じでsemanticsが異なる
そのため、一部のコード片を読むだけでは判断できないこともある
ownershipが実際に移動している
元のownerは未初期化状態になる
例.rslet s1 = String::from("hello");
let s2 = s1; // ownerがs1からs2にmove
println!("{}", s1); // エラー: s1は未初期化状態
copy
ownershipをmoveせずにcopyを行う
2つの独立した値に、それぞれ別のownerができる
例.rslet x = 5;
let y = x; // xはCopyされる
println!("{}", x); // OK: xは有効なまま
cloneもここに含まれる
ownershipをmoveせずに参照を貸し出す
immutable/mutableの2種類がある
例.rslet s1 = String::from("hello");
let s2 = &s1; // s1をイミュータブルに借用
println!("{}", s1); // OK: イミュータブル借用中の読み取りは許可される
借り側が、貸し側より長生きしてはいけないなどの制限が別途必要になる