レッスン1 — Rust:所有権と借用の5分入門
問い
これから Alloy を書き始めると必ず突き当たるのが 所有権(ownership)。Rust 最大の特徴で最初の壁。完璧な理解は不要、「コードを読みながらルールを思い出せる」 状態を目指す。
原理(最小モデル)
- 所有権 = コンパイル時のメモリ管理. C/C++ は人間が、Java/JS は GC が、Rust はコンパイラが「誰が所有し、いつ解放するか」を検証 → GC なし安全 + 二重解放 / use-after-free 防止 + データ競合防止。
- 3 ルール. ① 各値には所有者がちょうど 1 人、② 所有者がスコープを抜けると値はドロップ、③ 値はムーブ or 借用される。
- 借用
&と&mut.&= 読み取り(複数同時可)/&mut= 書き換え(同時に 1 つだけ)= データ競合をコンパイル時に防ぐ。 &str= 文字列の借用.Stringを所有 + その一部を&strとして貸す、関数引数&strは「読み取りで十分、所有権不要」の宣言。- Alloy で頻出する 3 パターン.
"...".parse()?(文字列パース + エラー伝播)/provider.get_balance(&address).await?(借用渡し)/let mut signer = ...(書き換え許可)。
具体例 + ステップで組み立てる
Rust:所有権と借用の5分入門
これからAlloyを書き始めると、必ず突き当たるのが 所有権(ownership) である。Rust最大の特徴であり、最初の壁でもある。完璧な理解は不要で、「コードを読みながらルールを思い出せる」 状態を目指す。
1. なぜ所有権が必要なのか
C/C++は人間がメモリ管理を担い、Java/JSはGCが担う。Rustは コンパイル時に「誰が所有し、いつ解放するか」を検証 する第三の道を取る。
そのおかげで、
- ガベージコレクタなしで安全
- メモリ二重解放やuse-after-freeがコンパイル時に検出される
- 並行処理でデータ競合がコンパイル時に検出される
…という「金融資産を扱うコードに適した性質」が得られる。
2. 所有権のルール(3つだけ)
1. 各値には「所有者」がちょうど一人いる
2. 所有者がスコープを抜けると値はドロップ(解放)される
3. 値はムーブ(所有権の移動)か、借用される
3. ムーブ(所有権の移動)
let s1 = String::from("hello");
let s2 = s1; // 所有権が s1 → s2 へ「ムーブ」
// println!("{}", s1); // ❌ コンパイルエラー:s1はもう使えない
println!("{}", s2); // OK
4. 借用(&):読み取り専用の参照
書き換えずに見るだけなら、所有権を渡さなくていい:
fn print_addr(addr: &String) {
println!("{}", addr);
}
let a = String::from("0xABCD...");
print_addr(&a); // & で「貸す」
print_addr(&a); // 所有権はaに残ったままなので何度でも貸せる
5. 可変参照(&mut):書き換える参照
fn append_suffix(s: &mut String) {
s.push_str("...");
}
let mut a = String::from("Hello");
append_suffix(&mut a);
ルール: 同時に存在できるのは、
- 複数の
&(読み取り) OR - ただ1つの
&mut(書き換え)
このルールで、データ競合はコンパイル時に防がれる。
6. &str は何者なのか
実は &str は 「文字列の借用」 である。String を所有し、その一部を &str として貸し出すイメージになる。
let owned: String = String::from("Hello, Alloy");
let borrowed: &str = &owned; // 借用
関数引数で &str を要求するのは、「読み取りで十分で所有権は不要」という宣言である。
7. これからAlloyコードで見るパターン
// 「.parse()?」 → 文字列をパースしてエラーは伝播
let url = "https://eth.llamarpc.com".parse()?;
// 「&」で借用を渡す
provider.get_balance(&address).await?;
// 「mut」で書き換え許可
let mut signer = PrivateKeySigner::random();
これらはすべて所有権ルールに由来する。次のレッスンでAlloyコードを書くときに「これは借用だ」と気づければ十分である。
まとめ
| 記号 | 意味 |
|---|---|
x | 所有 |
&x | 借用(読み取り) |
&mut x | 借用(書き換え) |
mut x | 変数を書き換え可にする |
所有権の感覚は 書きながら身につける ものなので、いま完璧でなくて大丈夫。次へ進みましょう。
まとめ(3行)
- 所有権 3 ルール = 各値 1 所有者、スコープ離脱でドロップ、ムーブ or 借用、コンパイル時メモリ管理 = GC なし安全。
&読み取り(複数可)+&mut書き換え(1 つだけ)= データ競合防止、&strはStringの借用。- 完璧な理解は不要、「コードを読みながら思い出せる」が目標、次レッスンで Alloy 基本型と署名へ。