Rust の入門書は所有権の説明から始まります。しかし多くの人は、所有権の必要性を感じる前に定義を読まされて脱落します。おすすめは、コンパイラに怒られてから理解する順番です。
Day 1-2: とにかく move で怒られる
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1); // error[E0382]: borrow of moved value: `s1`
このエラーを10回出してください。「値の持ち主は常に1人」という規則が、説明を読むより早く身体に入ります。
Day 3-4: 借用で回避する
所有権を渡したくないときは参照を渡します。& を付けるだけで通ることを体験すると、借用が「所有権を渡さずに貸す仕組み」だと納得できます。
fn show(s: &String) { println!("{}", s); }
let s = String::from("hello");
show(&s);
println!("{}", s); // まだ使える
Day 5: 可変借用の制約にぶつかる
「不変借用は何個でも、可変借用は1つだけ、両者は共存できない」。この規則は、データ競合をコンパイル時に潰すためのものです。並行処理を書く段階になると、ありがたさが実感できます。
Day 6-7: ライフタイムは最後でいい
ライフタイム注釈は、構造体に参照を持たせるまでほとんど書きません。入門段階では 'a の意味を暗記するより、clone() して先に進むほうが学習効率は高いです。
最初のうちは clone を許可してください。所有権の理解が進めば、自然と減っていきます。