見出し画像

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

【第3回】Cargo・依存ライブラリ・セキュリティ

 今回の連載について、ChatGPT(5.5)に全体構成とファクトチェックと表紙画像生成を、Claude Cowork(Opus 4.8)に原稿作成を、それぞれ担当してもらいました。最後に、私が加筆・修正しています。

いいなと思ったら応援しよう!