Claude Codeを使いこなすためのRust入門【第1回】所有権・借用を理解すれば世界が変わる
はじめに:「Rust言語はなんだか難しい」と感じる
Claude Code がスラスラとコードを書いてくれる。でも、いざ動かそうとすると、見たことのない英語のエラーがずらっと出てくる。
「`borrow of moved value`って何…?」
「直してと言ったのに、また別のエラーが出た…」
「そもそも、このコードが何をしているのか分からない…」
Claude Code を使って Rust のアプリを作りはじめた方は、こんな経験をしていませんか?でも、安心してください。これは、Rust という言語が、他の言語とは少し違う「クセ」を持っているからです。
そして、そのクセのほとんどは、たった2つの考え方を理解するだけで、ぐっと見通しがよくなります。
この連載(全3回)では、Rust の文法を全部覚えるよりも、むしろ、Claude Code が書いたコードを「読めて」「エラーの理由がなんとなく分かって」「AI に正しくお願いできる」ようになること、を目指します。
なぜこの知識が必要なのか
「コードは Claude Code が書いてくれるんだから、文法なんて知らなくてもいいのでは?」と思うかもしれません。半分は正解です。
でも、実際に作っていくと、次のような場面に出くわします。
AI が出したコードがエラーになる。 → 「直して」と頼む。 → 別のエラーになる。 → また「直して」と頼む。 → ・・・なかなか終わらない。
これは、あなたが「何が起きているか」を理解していないと、AI に「どう直してほしいか」を伝えられないために起こります。
料理に例えてみましょう。レストランで「この料理、なんか違う」とだけ言われても、シェフは困ります。「もう少し塩を控えめに」と言えれば、シェフはすぐに直せます。
Claude Code も同じです。あなたが少しだけ仕組みを知っているだけで、的確な指示が出せて、開発がスムーズに進むのです。
そして Rust の場合、その「少しだけ知っておくべきこと」の中心が、所有権と借用です。
Rustがバイブコーディングで人気な理由
なぜあえてちょっと難しい Rust がバイブコーディングで人気があるのかを知っておきましょう。
Rust の最大の魅力は、「速くて、安全」という点です。
多くのプログラミング言語では、プログラムが動いている最中に「メモリ」というパソコンの作業スペースの管理を、こっそり別の仕組みにお任せしています。
これは楽な反面、動作が少し遅くなることがあります。
一方で、その管理を人間が手作業でやる言語もありますが、こちらはミスをすると突然プログラムが壊れたり、セキュリティ上の問題を起こしたりします。
そこで、Rust は、「プログラムを実行する前の段階で、メモリの使い方の間違いの多くをチェックできる」という仕組みを採用したのです。
このチェック係こそが、これから出てくる「所有権」と「借用」のルールです。
つまり、あのエラーは、「AIが間違えて作った危ないコードを、動かす前に止めてくれている」のです。
なぜRust初心者は「難しい」と感じるのか
他のプログラミング言語では、変数(データを入れる箱)は、わりと自由に使い回せます。同じデータを、あちこちのコードから好きなように見たり、書き換えたりすることができる言語も多いです。
ところが、 Rust には、こんなルールがあります。
「ひとつのデータには、持ち主(オーナー)はひとりだけ」
データの持ち主は、所有権を持っていて、そのデータを自由に見たり書き換えたりすることができます。持ち主以外は、そのデータを見たり書き換えたりすることが制限されます。
このルールは、Rust初心者が最初につまずく原因です。多くの他の言語を知っている人は「えっ、なんでそんな制約が?」と戸惑います。
でも、このルールこそが Rust の安全性の正体です。ここから、じっくり見ていきましょう。
ルール(1):move(移動)
たとえば、ここに1冊のノートがあるとします。このノートには「持ち主はひとりだけ」というルールがあります。このルールをコードで見てみましょう。
fn main() {
let a = String::from("ノート");
let b = a; // ノートの持ち主が a から b に移った
println!("{}", b); // OK:b が今の持ち主
println!("{}", a); // エラー:a はもう持ち主ではない
} このコードでは、まず `a` がノートを手に入れます。
次の行でString型の a について `let b = a;` としたとき、Rust の世界では「ノートの持ち主が a から b に代わった」と考えます。そうすると、a はもうノートを持っていません。だから、最後の行で a にノートを見せてと頼んでも、「a はもう空っぽですよ」とエラーを出すのです。
この「持ち主が代わること」を、move(移動)と呼びます。
「ノートを友達に渡したら、もう自分の手元にはない」というのは、現実世界の物であれば、ごく当たり前の感覚です。ここがポイントです。他の多くの言語では、誰かがデータを持っていても、他の人も自由にそのデータを使えることが多いのです。
これに対して、 Rust では、原則として、データは「移動」します。渡したら、元の持ち主からはデータが消える。
だから Claude Code が書いたコードでも、「一度使った変数を、あとでもう一度使おうとしてエラー」ということがよく起こります。
基本概念(2):borrow(借用)
「えっ、渡したら自分は使えなくなるなら、すごく不便じゃない?」
そう思いますよね。そこで登場するのがborrow(借用)です。
借用とは、持ち主はそのままで、データを「ちょっと貸してあげる」ことです。
ノートの例で言えば、「ノートは自分のものだけど、友達にちょっと見せてあげる」という感じです。見せるだけなので、持ち主は変わりません。
コードでは、データの前に `&` という記号をつけて表します。
fn main() {
let a = String::from("ノート");
let b = &a; // a のノートを b に「貸す」
println!("{}", b); // OK:借りて中身を見ている
println!("{}", a); // OK:a はずっと持ち主のまま
}`&a` の `&` が借りる合図です。b はノートを借りているだけなので、持ち主の a はそのまま使えます。これなら、さっきのような「a から移動して消えた」という問題は起きません。
この `&` がついた借用を、よく参照とも呼びます。「データそのものではなく、データの場所を指し示している」というイメージです。
借用には、ひとつ大事なルールがあります。
「見るだけの借用であれば複数人でデータを見ることができるが、書き換えることもできる借用の場合は借りられるのは1人だけ」
誰かがノートに書き込んでいる最中に、他の人が同時に書き込んだら、内容がぐちゃぐちゃになってしまいます。
Rust はこのトラブルを防ぐために、「書き換え用の貸し出し(`&mut`)は、同時にひとつまで」というルールを持っています。ここで、`&mut` の `mut` は「変更できる(mutable)」という意味です。
Claude Codeでよく見るエラー
ここまで分かれば、あのエラーも怖くありません。代表的なものを3つだけ紹介します。
(1) `borrow of moved value`
直訳すると「移動した値を借りようとした」。もう別の持ち主が持って行った(move された)データを、借りようとしています。
(2) `cannot borrow as mutable`
直訳すると「書き換え用に借りられない」。例えば、すでに他の人が書き換え用に借りているのかもしれません。
(3) `value borrowed here after move`
(1)とほぼ同じ仲間で、「移動したあとに、また借りようとした」というお知らせです。
どのエラーも、根っこは同じです。「持ち主は誰? それは貸し出し中?」という話なのです。
ここで大事なメッセージをひとつ。
これらのエラーを、自分で完璧に直せる必要はありません。
あなたがやるべきことは、「あ、これは所有権まわりの話だな」と気づくこと。そして、Claude Code に的確にお願いすることです。
AIへの修正依頼例
ここが、この記事のいちばん大事なところです。
エラーが出たとき、つい「エラー直して」と言いたくなります。でも、それだと AI は「とりあえず動けばいい」直し方をしがちです。データを勝手にコピーしたり、設計を変えてしまったりします。
そこで、少しだけ言葉を足してみましょう。
あまり良くない例
エラーを直して
良い例
`borrow of moved value` というエラーが出ています。
所有権を維持したまま、`&` を使った借用で解決できますか?
もし難しい場合は、なぜ move が必要なのかも教えてください。
ポイントは3つです。
・エラーメッセージをそのまま貼ること。
・「所有権」「借用」という言葉を使うこと。
・「こう直してほしい」という方向を示すこと。
これだけで、Claude Code の修正の精度はぐっと上がります。
まとめ
今回は、Rust でいちばん大事な「所有権」と「借用」をお話ししました。
最後に、今回の記事の内容を整理します。
所有権:データの持ち主はひとりだけ
move(移動):渡したら、元の場所からは消える
borrow(借用):`&` をつけて「貸す」。持ち主は変わらない
借用のルール:見るだけは何人でも、書き換えは1人だけ
よくあるエラー:その多くは「持ち主は誰? 貸し出し中?」の話
エラーが出たときに「これは所有権の話かも」と気づけて、AI に「借用を使って直して」とお願いできれば、精度がぐっと上がります。
Rust は確かに少しクセのある言語です。でも、あなたには Claude Code という強力な相棒がいます。所有権と借用というRustの安全性を支える土台を少し知っているだけで、Claude Codeを上手に使いこなせます。
次回は、Claude Code を使いこなすうえで、特につまずきやすい`Option`・`Result`・`async` についてお話しします。これらも、所有権と借用という土台の上に成り立っています。今回の内容を押さえておけば、これらの概念も理解しやすくなるでしょう。
【第2回】つまずきやすいポイントOption・Result・async
今回の連載について、ChatGPT(5.5)に全体構成とファクトチェックと表紙画像生成を、Claude Cowork(Opus 4.8)に原稿作成を、それぞれ担当してもらいました。最後に、私が加筆・修正しています。
