<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「不変参照」タグの記事一覧｜Rust Tech</title>
	<atom:link href="https://rust-tech.nkhn37.net/tag/immutable-reference/feed/" rel="self" type="application/rss+xml" />
	<link>https://rust-tech.nkhn37.net</link>
	<description>Rustプログラミング学習サイト</description>
	<lastBuildDate>Fri, 20 Mar 2026 22:50:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://rust-tech.nkhn37.net/wp-content/uploads/2025/06/cropped-lion-preasure-clear-32x32.png</url>
	<title>「不変参照」タグの記事一覧｜Rust Tech</title>
	<link>https://rust-tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Rust入門】所有権と借用の基本を分かりやすく解説</title>
		<link>https://rust-tech.nkhn37.net/rust-ownership-borrowing-basic/</link>
					<comments>https://rust-tech.nkhn37.net/rust-ownership-borrowing-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 19 Jul 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[コピー]]></category>
		<category><![CDATA[ムーブ]]></category>
		<category><![CDATA[不変参照]]></category>
		<category><![CDATA[借用]]></category>
		<category><![CDATA[借用チェッカー]]></category>
		<category><![CDATA[可変参照]]></category>
		<category><![CDATA[所有権]]></category>
		<guid isPermaLink="false">https://rust-tech.nkhn37.net/?p=391</guid>

					<description><![CDATA[Rust の大きな特徴の1つである所有権（Ownership）と借用（Borrowing）について基本的な考え方を初心者にも分かりやすく解説します。 Rust の所有権（Ownership） 所有権の規則 Rust の公 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rust の大きな特徴の1つである<span class="jinr-d--text-color d--marker1 d--bold">所有権（Ownership）</span>と<span class="jinr-d--text-color d--marker1 d--bold">借用（Borrowing）</span>について基本的な考え方を初心者にも分かりやすく解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Rust の所有権（Ownership）</h2>



<h3 class="wp-block-heading jinr-heading d--bold">所有権の規則</h3>



<p class="wp-block-paragraph">Rust の公式ドキュメントである <a href="https://doc.rust-lang.org/book/title-page.html" target="_blank" rel="noreferrer noopener">The Book</a> の所有権の章で書かれている基本原則は以下の3つです。</p>



<ol class="wp-block-list jinr-list">
<li>Rust の各値は、所有者と呼ばれる変数と対応している。</li>



<li>所有権を持てる変数は、ある時点で必ず1つだけである。</li>



<li>所有権がスコープから外れたら、値は破棄される。</li>
</ol>



<p class="wp-block-paragraph">Rust では、各値に対して「<span class="jinr-d--text-color d--marker1 d--bold">誰が責任をもつか（所有権をもつか）</span>」を明確にします。実行のあらゆる瞬間において所有者となる変数は必ず1つであり、その変数がスコープから外れると、所有する値は自動的に破棄されます。これにより、メモリの手動解放が不要になり、メモリリークを防ぐことができます。</p>



<p class="wp-block-paragraph">また、所有者の変数がスコープを抜けたときに1度だけ破棄処理が行われるため、C/C++ のように手動で開放する必要がありません。これにより、メモリの二重解放といったバグも防ぐことができます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">Rust の公式ドキュメントの所有権のページは以下になります。</p>



<p class="wp-block-paragraph">[英語版] <a href="https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html" target="_blank" rel="noreferrer noopener">Understanding Ownership</a></p>



<p class="wp-block-paragraph">[日本語版] <a href="https://doc.rust-jp.rs/book-ja/ch04-00-understanding-ownership.html" target="_blank" rel="noreferrer noopener">所有権を理解する</a></p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">所有権の移動（ムーブ）</h3>



<p class="wp-block-paragraph">所有権を持っている変数は、所有者である間は自由に使うことができます。しかし、変数への代入などが行われる際に、所有権が移ります。<span class="jinr-d--text-color d--marker1 d--bold">所有権が移動することをムーブ（move）</span>と言います。ただし、所有権を移動せずにコピーとして処理される例もありますので、そのパターンについては後述します。</p>



<p class="wp-block-paragraph">所有権が移動される代表的なパターンは以下になります。</p>



<ol class="wp-block-list jinr-list">
<li>他の変数への代入</li>



<li>関数に引数として渡すとき</li>



<li>関数から戻り値として返すとき</li>
</ol>



<p class="wp-block-paragraph">それぞれを簡単な例で見ていきましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold">他の変数への代入</h4>



<p class="wp-block-paragraph">以下は、<code>String</code> 型の変数 <code>s1</code> の値を <code>s2</code> に代入している例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    let s1 = String::from("Hello World!");

    // 所有権が s1 から s2 に移動（ムーブ）する
    let s2 = s1;

    // ここから s1 は使用できなくなる
    println!("{}", s1);
}</pre>



<p class="wp-block-paragraph">上記の例でコンパイルをしようとすると「<code>borrow of moved value: s1</code>」というコンパイルエラーとなります。これは「<code>let s2 = s1;</code>」のタイミングで所有権が s2 へ移動してしまっているためです。</p>



<h4 class="wp-block-heading jinr-heading d--bold">関数に引数として渡すとき</h4>



<p class="wp-block-paragraph">以下は、<code>main</code> 関数で定義した <code>s1</code> という <code>String</code> 型の変数を関数 <code>takes_ownership</code> へ実引数として渡しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 所有権が呼び出し元の変数から s に移動（ムーブ）してくる
fn takes_ownership(s: String) {
    println!("{}", s);
}

fn main() {
    let s1 = String::from("Hellow World");

    // 所有権が関数の引数に移動（ムーブ）する
    takes_ownership(s1);

    // ここから s1 は使用できなくなる。
    println!("{}", s1);
}</pre>



<p class="wp-block-paragraph">上記についてもコンパイルしようとすると「<code>borrow of moved value: s1</code>」というコンパイルエラーとなります。この例では、関数の仮引数 <code>s</code> に渡された際に所有権が <code>s</code> に移っています。そのため、<code>main</code> 関数では <code>s1</code> は使用できなくなります。</p>



<p class="wp-block-paragraph">また、<code>println!</code> の部分をコメントアウトすればコンパイルはできますが、関数側に所有権が渡されていることにより関数ブロックが終わったタイミングで <code>s</code> は既に破棄されます。そのため、関数から戻った時点で文字列は既に破棄されています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">関数から戻り値として返すとき</h4>



<p class="wp-block-paragraph">以下は、関数 <code>gives_ownership</code> 関数内で定義した <code>s</code> を呼び出し元の <code>main</code> 関数へ返している例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn gives_ownership() -> String {
    let s = String::from("Hello World");
    // 所有権が呼び出し元に移動（ムーブ）する
    s
}

fn main() {
    // 関数で定義した変数の所有権が移動（ムーブ）してくる
    let s1 = gives_ownership();

    println!("{}", s1);
}</pre>



<p class="wp-block-paragraph">上記の例では、<code>gives_ownership</code> 関数内で定義された変数ですが、<code>main</code> 関数側に戻ってきた際に、<code>s1</code> 変数に所有権が移っています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ムーブ と コピー</h3>



<p class="wp-block-paragraph">上記では、所有権の移動が起こる例を見てきました。Rust では、変数の代入や関数への引数渡しの際には「ムーブ」または「コピー」が行われます。</p>



<p class="wp-block-paragraph">コピーでは、主にスタック上に保持されているような小さなデータ型の値が、ビット列ごと複製され、両方の変数が独立してメモリ上に同じ値を保持できます。一方でムーブでは、元の変数から新しい変数へ所有権だけが移り、実体はメモリ上に1つだけです。</p>



<p class="wp-block-paragraph">Rust の型においては、以下のような違いがあります。</p>



<ul class="wp-block-list jinr-list">
<li>基本型の <code>i32</code> などのスタックに格納される変数はコピーとなる。</li>



<li><code>String</code>、<code>Vec&lt;T&gt;</code> などのヒープに格納される変数はムーブとなる。</li>
</ul>



<p class="wp-block-paragraph">Rustでは、データがメモリ上のどこに置かれるか（スタック or ヒープ）によって、コピーされるかムーブされるかが決まる傾向があります。</p>



<p class="wp-block-paragraph">ヒープで確保される型は、サイズを変更することができ、容量が大きくなる可能性もあることから、コピー自体の負荷も高くなる可能性があるためです。一方で、スタックに配置される型は、サイズも小さく決まっており、コピーは素早くできるため、全体の効率が良くなります。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox1 ">
			<i class="jif jin-ifont-v2bulb" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">正確には、<code>Copy</code> トレイトが実装されている型は、代入や引数渡し時にコピーされ、<code>Copy</code> トレイトが実装されていない型はデフォルトでムーブとなります。ここでは簡単のため上記のように記載しています。</p>



<p class="wp-block-paragraph">トレイトとは、型に特定の振る舞いを追加する仕組みで、他の言語におけるインターフェースなどに似た概念です。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">スタックとヒープ</h4>



<p class="wp-block-paragraph">スタックとヒープという言葉を出しましたので、簡単に触れておきましょう。メモリ領域の中には「テキスト領域」「静的領域」「スタック領域」「ヒープ領域」という領域が分かれています。それぞれの領域の使われ方は以下の通りです。</p>



<ul class="wp-block-list jinr-list">
<li>テキスト領域：プログラムの実行コードが格納されます。</li>



<li>静的領域：<code>static</code> 変数など、プログラム全体を通じて使われる値が格納されます。</li>



<li>スタック領域：関数の変数（ <code>i32</code>、<code>bool</code> など）の小さな値が置かれます。サイズが決まっているため出し入れが速く処理効率が高いです。</li>



<li>ヒープ領域：<code>String</code> や <code>Vec&lt;T&gt;</code> のようにサイズが実行時に決まるデータが使う領域です。</li>
</ul>



<h4 class="wp-block-heading jinr-heading d--bold">コピーとムーブの例を確認</h4>



<p class="wp-block-paragraph">コピーされる例とムーブされる例を見ておきましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // コピーされる例 (i32)
    let x = 10;
    let y = x;
    // コピーなので x も y も使用できる
    println!("{}", x);
    println!("{}", y);

    // 移動 (ムーブ) される例 (String)
    let s1 = String::from("Hello World");
    let s2 = s1;
    // 所有権が移っているので s2 は使える
    println!("{}", s2);
    // s1 は使えない (コメントアウトを外すとコンパイルエラー)
    // println!("{}", s1);
}</pre>



<p class="wp-block-paragraph">上記では、基本型である <code>i32</code> の変数 <code>x</code>、<code>y</code> の代入と、<code>String</code> 型である <code>s1</code>、<code>s2</code> の代入をしています。基本型である <code>i32</code> は <code>x</code> の値が <code>y</code> にコピーされるためどちらの値も使用できています。一方で、<code>String</code> 型については、<code>s2 = s1;</code> の時点で所有権が移動（ムーブ）しているため、それ以降 <code>s1</code> は使えません。（上記例でコメントアウトを外すとコンパイルエラーとなります。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>clone</code> の活用：所有権を保持したままデータをコピー</h4>



<p class="wp-block-paragraph">所有権が移動するような <code>String</code>、<code>Vec</code> 型についても <code><span class="jinr-d--text-color d--marker1 d--bold">clone()</span></code> を使用することにより明示的にコピーすることも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    let s1 = String::from("Hello World!");

    // clone によりコピーをすることも可能
    let s2 = s1.clone();

    // s1 も s2 もいずれも使える
    println!("{}", s1);
    println!("{}", s2);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
Hello World!
Hello World!</pre>



<p class="wp-block-paragraph">Rust では、コンパイルエラーで非常に詳しくエラーメッセージを出してくれますので、メッセージを注意深く読むことで、問題の場所やスコープをしっかり見直すことで所有権の問題を解消することができます。</p>



<p class="wp-block-paragraph">ただし、Rust 初心者でどうしてもコンパイルエラーを解消できない場合は、<code>clone()</code> を使用して所有権の問題を回避するのも1つの方法です。<code>clone()</code> を使用するような型（<code>String</code> や <code>Vec</code>）はヒープ領域にあるデータであるため、コピーで複製することは実行コストが基本型などよりも高くなる傾向にあります。このことを理解して使用をよく検討するようにしましょう。</p>



<div id="nkhn3-1425812094" class="nkhn3- nkhn3-entity-placement" style="margin-left: auto;margin-right: auto;text-align: center;"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9478001176347002"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-9478001176347002"
     data-ad-slot="4670569211"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div><h2 class="wp-block-heading jinr-heading d--bold">Rust の借用（Borrowing）</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">借用（Borrowing）</span>とは、所有権の移動を行わずに、他の変数から値を一時的に使わせてもらうことです。借用の中には、以下の2種類の参照があります。</p>



<ul class="wp-block-list jinr-list">
<li><span class="jinr-d--text-color d--marker1 d--bold">不変参照（immutable reference）</span>：読み取り専用の借用</li>



<li><span class="jinr-d--text-color d--marker1 d--bold">可変参照（mutable reference）</span>：書き込み可能な借用</li>
</ul>



<p class="wp-block-paragraph">それぞれの例を見ていきましょう。</p>



<h3 class="wp-block-heading jinr-heading d--bold">不変参照</h3>



<p class="wp-block-paragraph">不変参照（immutable reference）は、読み取り専用の借用であり、「<code>&amp;</code>」キーワードを使用して表します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn print_message(s: &amp;str) {
    // 不変参照なので読み取りのみ
    println!("{}", s);
}

fn main() {
    let s1 = String::from("Hello World");

    // s1 の内容を不変参照で関数に渡す
    print_message(&amp;s1);

    // s1 は所有権を持っているので、ここでもまだ使える
    println!("{}", s1);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
Hello World
Hello World</pre>



<p class="wp-block-paragraph">関数を呼び出す際には、「<code>&amp;変数名</code>」という形で不変参照を渡します。関数側の型注釈も「<code>: &amp;型名</code>」としておく必要があります。</p>



<p class="wp-block-paragraph">上記例では、関数 <code>print_message</code> に不変参照で <code>s1</code> 変数を渡しています。この時には、所有権の移動（ムーブ）は起こらないため、関数から戻ってきた際でも <code>s1</code> 変数を使用することが可能です。なお、関数の終了と共に、関数内の参照変数 <code>s</code> のスコープは終了します。ただし、参照先の実体 <code>s1</code> が破棄されるわけではありません。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box1  "><div class="a--simple-box-title d--bold">引数が <code>&amp;str</code> である理由</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記例では、関数を受ける際に <code>&amp;str</code> という形で受け取っています。<code>&amp;str</code> は、「文字列スライス」と呼ばれ、文字列の一部や全体を参照するための型です。<code>String</code> 型の参照は関数に渡す際に <code>&amp;str</code> に自動的に変換されるため、関数で <code>&amp;str</code> を指定しておけば、String 型も文字列リテラル（<code>"Hello World"</code> など）もどちらも渡せます。</p>



<p class="wp-block-paragraph">一方で、引数を <code>&amp;String</code> とすると <code>String</code> 型の参照しか受け取れなくなり、文字列リテラルを直接渡すことができません。そのため、関数で文字列の読み取りだけを行う場合は、より汎用的な <code>&amp;str</code> を使うのが一般的です。</p>
</div></div></section>



<h3 class="wp-block-heading jinr-heading d--bold">可変参照</h3>



<p class="wp-block-paragraph">可変参照（mutable reference）は、書き込みも可能な借用であり、「<code>&amp;mut</code>」キーワードを使用して表します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn append_message(s: &amp;mut String) {
    // 可変参照なので変更可能
    s.push_str("!!!");
}

fn main() {
    let mut s1 = String::from("Hello World");

    // s1 の内容を可変参照で関数に渡す
    append_message(&amp;mut s1);

    // 関数側で変更された結果が表示される
    println!("{}", s1);
}</pre>



<p class="wp-block-paragraph">関数を呼び出す際には、「<code>&amp;mut 変数名</code>」という形で可変参照を渡します。関数側の型注釈も「<code>: &amp;mut 型名</code>」としておく必要があります。</p>



<p class="wp-block-paragraph">上記の例では、変更可能なように参照を渡しているため、関数 <code>append_message</code> 側で文字列を変更することが可能です。また、<code>main</code> 関数に戻ってきた際にも変更が反映されていることが確認できます。なお、関数の終了と共に、関数内の参照変数 <code>s</code> のスコープは終了します。ただし、参照先の実体 <code>s1</code> が破棄されるわけではありません。</p>



<h3 class="wp-block-heading jinr-heading d--bold">借用チェッカー（borrow checker）</h3>



<p class="wp-block-paragraph">Rust のコンパイラには、<span class="jinr-d--text-color d--marker1 d--bold">借用チェッカー（borrow checker）</span>という重要な機能があります。この機能は、借用が安全に使われているかをコンパイル時に自動的にチェックしてくれます。Rust が「コンパイラが通れば安全性が保証される」と言われる中核の機能です。</p>



<p class="wp-block-paragraph">所有者である元の変数と共に存在できる参照の組み合わせは、基本的に次の2つのどちらかに限られます。</p>



<ol class="wp-block-list jinr-list">
<li>元の変数（所有者）＋ 1つまたは複数の不変参照</li>



<li>元の変数（所有者）＋ 可変参照 1つ</li>
</ol>



<p class="wp-block-paragraph">借用の基本的な考え方としては、以下のようになっており、借用チェッカーがコンパイルでチェックしてくれます。</p>



<ul class="wp-block-list jinr-list">
<li>参照があるときには、元の所有権を持つ変数であっても値の変更はできません。</li>



<li>可変参照（<code>&amp;mut T</code>）は、ある時点で1つだけしか存在できません。これによりデータの競合を防止することができます。</li>



<li>可変参照と不変参照は共存できません。これにより、不変参照が参照している間に意図せず値が変わってしまうことはありません。</li>



<li>参照が存在する間は、参照先のデータは解放されず、必ず有効なまま保持されます。これにより無効なメモリを指す状態（ダングリングポインタ）は発生しません。</li>
</ul>



<p class="wp-block-paragraph">現在状態に対して、どういった対応が可能かをまとめた表が以下になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong><span class="jinr-d--text-color d--marker2 d--bold">状態</span></strong></th><th class="has-text-align-center" data-align="center">不変参照の作成</th><th class="has-text-align-center" data-align="center">可変参照の作成</th><th class="has-text-align-center" data-align="center">所有権を持つ<br>変数の値を変更</th></tr></thead><tbody><tr><td>参照が存在しない</td><td class="has-text-align-center" data-align="center">〇<br>（自由に作れる）</td><td class="has-text-align-center" data-align="center">〇<br>（不変参照が存在しなければ作れる）</td><td class="has-text-align-center" data-align="center">〇<br>（参照がなければ自由に変更可能）</td></tr><tr><td>不変参照が存在<br>（読み取り専用）</td><td class="has-text-align-center" data-align="center">〇 <br>（複数OK）</td><td class="has-text-align-center" data-align="center">×<br>（不可）</td><td class="has-text-align-center" data-align="center">×<br>（不可）</td></tr><tr><td>可変参照が存在<br>（変更可）</td><td class="has-text-align-center" data-align="center">×<br>（不可）</td><td class="has-text-align-center" data-align="center">×<br>（同時に複数不可）</td><td class="has-text-align-center" data-align="center">×<br>（不可）</td></tr></tbody></table></figure>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Rust の所有権と借用の仕組みは、最初は少し難しく感じるかもしれません。しかし、この記事で紹介したように、基本的なルールは非常に明確でシンプルです。</p>



<ul class="wp-block-list jinr-list">
<li>所有権を持つ変数は必ず1つだけです。</li>



<li>所有権は移動（ムーブ）が基本ですが、型の種類によりコピーの場合もあります。</li>



<li>借用により渡せる参照には不変参照と可変参照があり、それぞれ同時に扱える条件が異なります。</li>



<li>Rust のコンパイラは「借用チェッカー」によって、これらのルールをコンパイル時に厳密にチェックしてくれます。</li>
</ul>



<p class="wp-block-paragraph">この仕組みにより、C/C++ などの言語でよく見られる <span class="jinr-d--text-color d--marker1 d--bold">メモリの二重解放やダングリングポインタといったバグを、言語レベルで防止</span>できます。結果として、安全で効率的なプログラムを記述することができるのが Rust の大きな魅力です。</p>



<p class="wp-block-paragraph">最初のうちは所有権や借用でコンパイルエラーになることも多いかもしれませんが、それは Rust が<span class="jinr-d--text-color d--marker1 d--bold">安全性を重視して設計された言語である証拠</span>です。丁寧にエラーメッセージを読み、今回学んだルールを少しずつ理解していけば、自然と扱えるようになっていくと思います。</p>



<p class="wp-block-paragraph">所有権と借用は、Rust の基礎であり、理解が進めば進むほど Rust らしいコードが書けるようになります。ぜひ繰り返し復習して、確かな理解を身につけてください。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/rust-tech-sample-source/tree/main/rust-basic/ownership-borrowing-basic" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://rust-tech.nkhn37.net/rust-programming-basics/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/08/77e7c51961993fb9cb96c02a2311436d-320x180.jpg" alt="Rust プログラミング入門" /></div><div class="a--blogcard-title d--bold">Rust プログラミング入門</div></a></section><div id="nkhn3-965305460" class="nkhn3-multiplex nkhn3-entity-placement" style="margin-left: auto;margin-right: auto;text-align: center;"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9478001176347002"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-9478001176347002"
     data-ad-slot="8958649655"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>]]></content:encoded>
					
					<wfw:commentRss>https://rust-tech.nkhn37.net/rust-ownership-borrowing-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: rust-tech.nkhn37.net @ 2026-07-22 10:48:00 by W3 Total Cache
-->