<?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/borrowing/feed/" rel="self" type="application/rss+xml" />
	<link>https://rust-tech.nkhn37.net</link>
	<description>Rustプログラミング学習サイト</description>
	<lastBuildDate>Fri, 20 Mar 2026 23:08:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</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-closure-basic/</link>
					<comments>https://rust-tech.nkhn37.net/rust-closure-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[move]]></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=1783</guid>

					<description><![CDATA[Rust におけるクロージャ（Closure）の基本を初心者にも分かりやすく解説します。 クロージャ（Closure）とは Rust におけるクロージャ（Closure）とは、「その場で定義できる無名の関数のようなもの」 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rust における<span class="jinr-d--text-color d--marker1 d--bold">クロージャ（Closure）</span>の基本を初心者にも分かりやすく解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">クロージャ（Closure）とは</h2>



<p class="wp-block-paragraph">Rust における<span class="jinr-d--text-color d--marker1 d--bold">クロージャ（Closure）</span>とは、「<strong>その場で定義できる無名の関数</strong>のようなもの」のことです。</p>



<p class="wp-block-paragraph">通常の <code>fn</code> で定義する関数との大きな違いは、外部のスコープにある変数を利用できることです。この「外側の変数を取り込んで使う」ことを「<strong>キャプチャ（capture）</strong>」と呼びます。</p>



<p class="wp-block-paragraph">共通的な変数をクロージャの中に取り込んでおくことで、他の可変な値と組み合わせながら、柔軟で再利用可能な処理を定義することができます。</p>



<p class="wp-block-paragraph">この記事では、<span class="jinr-d--text-color d--marker1 d--bold">Rust におけるクロージャの基本的な使い方や考え方</span>について紹介します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox5 ">
			<i class="jif jin-ifont-v2speaker" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><strong>【無名関数とクロージャ】</strong></p>



<p class="wp-block-paragraph">厳密には、クロージャという言葉は「<strong>外部の変数をキャプチャした関数</strong>」のことを言います。しかし、Rust では、外部の変数をキャプチャしていない場合でも、すべてクロージャと呼びます。</p>



<p class="wp-block-paragraph">Python などの他の言語では、「無名関数」と「クロージャ」を分けて説明されることがあります。一方で、Rust コミュニティでは「無名関数」という用語はほとんど使われず、一貫してクロージャという言葉で説明がされる点を覚えておくとよいでしょう。</p>
</div>
		</div></section>



<div id="nkhn3-2180577237" 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">クロージャの基本<br></h2>



<h3 class="wp-block-heading jinr-heading d--bold">クロージャの基本的な使い方</h3>



<p class="wp-block-paragraph">基本的なクロージャの使い方を紹介します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">|引数1, 引数2, ...| 式</pre>



<p class="wp-block-paragraph">クロージャの構文は非常にシンプルです。上記のように <code>||</code> 内に引数を列挙し、クロージャの返却値となる式をその後に記載します。引数なしのクロージャー (<code>|| 式</code>) でも問題ありません。</p>



<p class="wp-block-paragraph">また、複数の文を書く場合は、以下のように <code>{}</code> のブロックを使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">|引数1, 引数2, ...| {
    文;
    ...;
    式
}</pre>



<p class="wp-block-paragraph">最後の式は、クロージャの戻り値になります。最後に <code>;</code> (セミコロン) をつけると戻り値は <code>()</code> となります。</p>



<p class="wp-block-paragraph">それでは、簡単な具体例で確認してみましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold">単一式の例</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // ===== 単一の式のクロージャ例
    let add = |a, b| a + b;
    println!("add(2, 3) = {}", add(2, 3));
}</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="">【実行結果】
add(2, 3) = 5</pre>



<p class="wp-block-paragraph">この例では、変数 <code>a</code> と <code>b</code> を受け取り <code>a + b</code> という単一の式を計算するクロージャを定義して <code>add</code> という変数名に束縛しています。<code>a + b</code> がクロージャの戻り値になります。</p>



<p class="wp-block-paragraph">クロージャを使用する時には「<code>add(2, 3)</code>」のように使用します。もちろん、<code>add(4, 5)</code>、 &#8230;のように任意の引数での再利用が可能です。</p>



<p class="wp-block-paragraph">単一の式の場合であれば、<code>{}</code> を使用しなくても上記のように簡潔に書くことができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">引数なしの例</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // ===== 引数なしのクロージャ例
    let greet = || "Hello, Rust!";
    println!("greet() = {}", greet());
}</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="">【実行結果】
greet() = Hello, Rust!</pre>



<p class="wp-block-paragraph">クロージャは、引数がなくても使用できます。引数がない場合、|| のように何も書かずに定義します。この例では、<code>"Hello, Rust!"</code> という文字列リテラルがそのまま戻り値になります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ブロック形式の例</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // ===== ブロック形式のクロージャ例
    let multiply = |a, b| {
        println!("calculating {a} * {b} ...");
        // 最後の式がクロージャの戻り値になる
        a * b
    };
    println!("multiply(3, 5) = {}", multiply(3, 5));
}</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="">【実行結果】
calculating 3 * 5 ...
multiply(3, 5) = 15</pre>



<p class="wp-block-paragraph">複数の文を実行したい場合には、<code>{}</code> ブロックを使用します。例では、計算前に <code>println!</code> でメッセージを表示し、その後に <code>a * b</code> を評価しています。</p>



<p class="wp-block-paragraph">Rust では、ブロックの最後の式が戻り値になるというルールがあります。そのため、<code>a * b</code> に <code>;</code> (セミコロン) をつけないことが重要です。<code>;</code> を付けた場合の返却値は <code>()</code> となります。</p>



<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="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // ===== 外側の変数をキャプチャするクロージャ例
    let base = 10;

    let add_to_base = |x| base + x;
    println!("add_to_base(5) = {}", add_to_base(5));
}</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="">【実行結果】
add_to_base(5) = 15</pre>



<p class="wp-block-paragraph">この例では、<code>base</code> という変数をクロージャの外側で定義しています。<code>add_to_base</code> は、引数 <code>x</code> だけを受け取っていますが、計算で <code>base</code> も利用しています。このように <code>add_to_base</code> を用意しておくと、様々な <code>x</code> に対して <code>base</code> を足した結果を再利用して計算できます。</p>



<p class="wp-block-paragraph">あたかも add_to_base が base 変数を捕捉した状態で使いまわせるため「キャプチャする」という表現が使われています。</p>



<p class="wp-block-paragraph">このように、外側のスコープにある変数を取り込んで使用することができるのがクロージャの本質です。ここまでの例を振り返るとクロージャーは次のような特徴があることが分かります。</p>



<ul class="wp-block-list jinr-list">
<li>関数のように振る舞う</li>



<li><code>fn</code> を使わなくても、その場で定義することができる</li>



<li>外側の変数を利用することができる（キャプチャできる）</li>
</ul>



<p class="wp-block-paragraph">つまり、単なる無名関数というだけではなく、定義された環境設定ごと関数を扱える仕組みであることがクロージャの本当の価値です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">クロージャの型注釈と型推論</h3>



<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() {
    // ===== 単一の式のクロージャ例 (型注釈あり)
    let subtract = |a: i32, b: i32| a - b;
    println!("subtract(5, 2) = {}", subtract(5, 2));
}</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="">【実行結果】
subtract(5, 2) = 3</pre>



<p class="wp-block-paragraph">例のように <code>a: i32, b: i32</code> といった形で型注釈を書くことができます。なお、戻り値については、<code>let subtract = |a: i32, b: i32| -&gt; i32 { a - b };</code> のように書くことも可能ですが、引数の型が決まれば、戻り値の型は式から自動推論できるため、通常は記載しません。</p>



<h4 class="wp-block-heading jinr-heading d--bold">クロージャの型推論</h4>



<p class="wp-block-paragraph">クロージャは型推論をすると記載しましたが、どこで型が確定するかというと「<span class="jinr-d--text-color d--marker1 d--bold">最初にクロージャが使用されたときの型</span>」で確定となります。そのため、先ほどの例で一度 <code>add(2, 3)</code> と使用した<span class="jinr-d--text-color d--marker1">後に</span>以下のように、<code>floating-point</code> で使用しようとするとコンパイルエラーとなります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">println!("add(1.0, 2.0) = {}", add(1.0, 2.0));</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="">【エラー例】
error[E0308]: arguments to this function are incorrect
  --> rust-basic\closure-basic\examples\closure_basic.rs:28:36
   |
28 |     println!("add(1.0, 2.0) = {}", add(1.0, 2.0));
   |                                    ^^^ ---  --- expected integer, found floating-point number
   |                                        |
   |                                        expected integer, found floating-point number</pre>



<h2 class="wp-block-heading jinr-heading d--bold">クロージャのキャプチャの方法</h2>



<p class="wp-block-paragraph">ここでは、クロージャのキャプチャについて少し詳しく見てみましょう。キャプチャとは、クロージャが外側のスコープにある変数を取り込んで利用することでした。</p>



<p class="wp-block-paragraph">Rust のクロージャでは、外側の変数をどのように扱うかに応じて、キャプチャ方法をコンパイラが自動で選択します。主なキャプチャの方法には以下の 3 種類です。</p>



<ol class="wp-block-list jinr-list">
<li>不変参照でのキャプチャ</li>



<li>可変参照でのキャプチャ</li>



<li><code>move</code> による所有権の移動でのキャプチャ</li>
</ol>



<h3 class="wp-block-heading jinr-heading d--bold">不変参照でのキャプチャ</h3>



<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() {
    // ===== 不変参照でのキャプチャ例
    let x = 10;
    // x は不変参照でキャプチャされる
    let f = |y| x + y;

    // クロージャの呼び出し
    println!("f(5) = {}", f(5));
    // xはまだ使用可能
    println!("x = {}", x);
}</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="">【実行結果】
f(5) = 15
x = 10</pre>



<p class="wp-block-paragraph">例のクロージャでは、<code>x</code> を不変参照しているだけで変更していません。そのため、クロージャを呼び出した後でも <code>x</code> は使用できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">可変参照でのキャプチャ</h3>



<p class="wp-block-paragraph">クロージャの中で外側の変数を変更する場合、クロージャはその変数を可変参照でキャプチャします。以下は、<code>count</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 mut count = 0;
    println!("count before: {}", count);
    // countは可変参照でキャプチャされる
    let mut g = || count += 1;

    // クロージャを呼び出すとcountが変更される
    g();
    // countは変更されている
    println!("count after: {}", count);
}</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="">【実行結果】
count before: 0
count after: 1</pre>



<p class="wp-block-paragraph">可変参照でキャプチャする場合は、外側の変数は <code>let mut</code> により、変更可能（ミュータブル）な変数として定義する必要があります。また、クロージャを変数（上記例では <code>g</code>）に束縛する場合は、<code>g</code> についても <code>let mut</code> で変更可能な形で定義する必要があります。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>move</code> による所有権の移動でのキャプチャ</h3>



<p class="wp-block-paragraph">これまでの例では、外側の変数は参照としてキャプチャされていました。以下のようにクロージャの定義の前に <span class="jinr-d--text-color d--marker1 d--bold"><code>move</code></span> をつけることで、外側の変数は所有権ごとクロージャに移動します。</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() {
    // ===== move による所有権の移動でのキャプチャ例
    let s = String::from("Hello");
    // s は move で所有権がクロージャに移動される
    let h = move || println!("{s} World!");

    // 実行時に s は消費されて使用できなくなる
    h();
    // sはmoveで所有権が移動されているため以降は使用できない
    // println!("{s}"); // コンパイルエラー
}
</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!</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="">【move 後のコメントアウト部分を外した場合のコンパイルエラー 一部抜粋】
error[E0382]: borrow of moved value: `s`
  --> rust-basic\closure-basic\examples\closure_capture.rs:31:16
   |
24 |     let s = String::from("Hello");
   |         - move occurs because `s` has type `String`, which does not implement the `Copy` trait
25 |     // s は move で所有権がクロージャに移動される
26 |     let h = move || println!("{s} World!");
   |             -------            - variable moved due to use in closure
   |             |
   |             value moved into closure here
...
31 |     println!("{s}"); // コンパイルエラー
   |                ^ value borrowed here after move</pre>



<p class="wp-block-paragraph">例のように、<code>move</code> を付けた時点で変数 <code>s</code> の所有権はクロージャに移動します。そのため、以降外側のスコープでは <code>s</code> は使用できません。使用しようとするとコンパイルエラーとなります。（例でコメントアウトしている部分を外して試してみてください。）</p>



<p class="wp-block-paragraph"><code>move</code> は、外側の値の所有権をクロージャ側に移して、クロージャがその値を保持できるようにしたい場合に使います。（例：スレッドに渡す、関数の外へ変数を持ち出す など）</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">所有権の基本については以下を参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://rust-tech.nkhn37.net/rust-ownership-borrowing-basic/" target="_blank" rel="noreferrer noopener">所有権と借用の基本を分かりやすく解説</a></p>
</div>
		</div></section>



<div id="nkhn3-1991030477" class="nkhn3--2 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">クロージャの型とトレイト</h2>



<p class="wp-block-paragraph">クロージャの基本的な使い方を紹介してきました。記事の冒頭で、クロージャは「その場で定義できる無名の関数<span class="jinr-d--text-color d--marker1 d--bold">のようなもの</span>」という少し曖昧な表現をしました。これは、クロージャの型やトレイトをより理解すると、関数とは異なるということが分かるためです。</p>



<p class="wp-block-paragraph">少し詳細な内容になるため、クロージャの型とトレイトについては「<a href="https://rust-tech.nkhn37.net/rust-closure-fn-traits/" target="_blank" rel="noreferrer noopener">クロージャの型とトレイト（Fn / FnMut / FnOnce）</a>」でまとめていますので参考にしてください。</p>



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



<p class="wp-block-paragraph">Rust における<span class="jinr-d--text-color d--marker1 d--bold">クロージャ（Closure）</span>の基本を解説しました。</p>



<p class="wp-block-paragraph">クロージャは 「 <code>|引数1, 引数2, …| 式</code>」の形式で、その場で定義できる無名の関数のような仕組みです。ブロック形式の場合は、最後の式が戻り値になります。また、型注釈は必要に応じて記載できますが、多くの場合は型推論に任せることができます。</p>



<p class="wp-block-paragraph">さらに、クロージャの本質である「キャプチャ」について、不変参照・可変参照・<code>move</code> による所有権移動の 3 パターンを紹介しました。特に <code>move</code> を使うと、外側の値の所有権がクロージャに移動し、以降は外側のスコープでは利用できなくなる点が重要です。</p>



<p class="wp-block-paragraph">クロージャは、その場で処理を定義できる非常に便利な機能で、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/closure-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-3047361616" 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-closure-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Rust入門】String 型と文字列スライス &#038;str 型の基本について分かりやすく解説</title>
		<link>https://rust-tech.nkhn37.net/rust-string-str-basic/</link>
					<comments>https://rust-tech.nkhn37.net/rust-string-str-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sun, 03 Aug 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[&str]]></category>
		<category><![CDATA[string]]></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=819</guid>

					<description><![CDATA[Rust で文字列を扱うための String 型と文字列スライス &#38;str 型の基本を初心者にも分かりやすく解説します。 Rust の文字列 どのプログラミング言語においても文字列を適切に扱えるようになることは非 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rust で文字列を扱うための <span class="jinr-d--text-color d--marker1 d--bold"><code>String</code> 型と文字列スライス <code>&amp;str</code> 型</span>の基本を初心者にも分かりやすく解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Rust の文字列</h2>



<p class="wp-block-paragraph">どのプログラミング言語においても文字列を適切に扱えるようになることは非常に重要です。Rust では、文字列を扱う際に主に登場するのが「<span class="jinr-d--text-color d--marker1 d--bold"><code>String</code> 型</span>」と「<span class="jinr-d--text-color d--marker1 d--bold">文字列スライス <code>&amp;str</code> 型</span>」の2つです。</p>



<p class="wp-block-paragraph"><code>String</code> 型は Rust の標準ライブラリとして提供される可変長の文字列型です。<code>String</code> 型は、文字列リテラル（例：<code>"Hello"</code>）とは異なり、ヒープ領域に格納されて動的にメモリが確保されます。</p>



<p class="wp-block-paragraph">文字列スライス（<code>&amp;str</code>） は、UTF-8 エンコードされた文字列データへの参照（借用）です。データ本体は別の場所（静的領域やヒープ領域）に存在し、<code>&amp;str</code> はその一部または全体を参照する仕組みです。</p>



<p class="wp-block-paragraph">この記事では、Rust の <code>String</code> 型と文字列スライス <code>&amp;str</code> 型について分かりやすく解説します。</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">所有権や借用については以下の記事も参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://rust-tech.nkhn37.net/rust-ownership-borrowing-basic/" target="_blank" rel="noreferrer noopener">【Rust入門】所有権と借用の基本を分かりやすく解説</a></p>
</div>
		</div></section>



<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">メモリ領域</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">メモリ領域の中には「テキスト領域」「静的領域」「スタック領域」「ヒープ領域」があります。以降の説明で必要になりますので簡単に紹介します。</p>



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



<li>静的領域：<code>static</code>&nbsp;変数など、プログラム全体を通じて使う値を格納します。</li>



<li>スタック領域：基本型（<code>i32</code> など）のサイズが決まった小さな値が置かれます。</li>



<li>ヒープ領域：<code>String</code>&nbsp;のようにサイズが実行時に決まるデータが使用する領域です。</li>
</ul>
</div></div></section>



<div id="nkhn3-1776563684" 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"><code>String</code> 型</h2>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型とは</h3>



<p class="wp-block-paragraph">Rust における <span class="jinr-d--text-color d--marker1 d--bold"><code>String</code> 型</span>は、可変長でありかつ所有権を持つ文字列型です。<code>String</code> は、ヒープ領域に格納され、実行時にサイズを変更したり、編集したりすることが可能です。ユーザーからの入力やファイルから読み込むデータ等、動的に得られる文字列を保持したいときには <code>String</code> を使用します。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型の使い方</h3>



<h4 class="wp-block-heading jinr-heading d--bold">String::from() を使用する</h4>



<p class="wp-block-paragraph"><code>String</code> を生成する一般的な方法は、標準ライブラリの <code>String</code> 型の関連関数 <code><span class="jinr-d--text-color d--marker1 d--bold">String::from()</span></code> を用いて生成する方法です。ヒープ上に新たに <code>String</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() {
    // 関連関数 from を使って生成
    let s = String::from("HelloWorld");

    println!("{}", s);
}</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="">【実行結果】
HelloWorld</pre>



<h4 class="wp-block-heading jinr-heading d--bold">to_string() メソッドを使用する</h4>



<p class="wp-block-paragraph">文字列スライスに対して <code><span class="jinr-d--text-color d--marker1 d--bold">to_string()</span></code> メソッドを呼び出すことで、<code>String</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() {
    // to_string メソッドを使って生成
    let s = "HelloWorld".to_string();

    println!("{}", s);
}</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="">【実行結果】
HelloWorld</pre>



<h4 class="wp-block-heading jinr-heading d--bold"><code>format</code> マクロを使用する</h4>



<p class="wp-block-paragraph"><code><span class="jinr-d--text-color d--marker1 d--bold">format</span></code> マクロを使うことで <code>String</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() {
    // format マクロを使って生成
    let part = "World";
    let s = format!("Hello{}", part);

    println!("{}", s);
}</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="">【実行結果】
HelloWorld</pre>



<p class="wp-block-paragraph"><code>print</code> マクロが、コンソールに文字列を出力するのに対して、<code>format</code> マクロは <code>String</code> オブジェクトを返します。変数の値を埋め込んで文字列を生成したい場合に便利です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">関連関数 <code>String::new()</code> を使用する</h4>



<p class="wp-block-paragraph">関連関数である <code><span class="jinr-d--text-color d--marker1 d--bold">String::new</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() {
    // 関連関数 new を使って生成
    let mut s = String::new();
    // 文字列を追加
    s.push_str("HelloWorld");

    println!("{}", s);
}</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="">【実行結果】
HelloWorld</pre>



<p class="wp-block-paragraph">変数宣言時点では、文字列が決まっておらず後で決まるような場合には、あらかじめ <code>new</code> で用意しておいて、 <code>push_str</code> メソッドなどで文字列を追加して使用します。<code>String</code> 型の各種メソッドについては後ほど詳しく説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String::from()</code> と <code>to_string()</code> の違い</h3>



<p class="wp-block-paragraph"><code>String::from()</code> と <code>to_string()</code> メソッドはどちらも同じ動作をするため、どちらの方法を利用しても構いません。内部的には、<code>String::from()</code> は、<code>String</code> 型の関連関数として定義されており、一方で <code>to_string()</code> メソッドは、<code>ToString</code> トレイトの実装に依存しています。</p>



<p class="wp-block-paragraph">例えば、上記例の <code>"HelloWorld"</code> は、文字列スライス <code>&amp;'static str</code> 型です。文字列スライスについては後ほど説明しますが、<code>&amp;str</code> 型は <code>ToString</code> トレイトを実装しているため <code>String</code> 型に変換できます。</p>



<p class="wp-block-paragraph">どちらを利用するかは好みやスタイルの違いで選んでも基本的には問題ありませんが、<code>to_string()</code> は <code>ToString</code> トレイトの実装に依存しており場合によっては期待しない型変換が行われない可能性もあります。明示的な意図を示す場合や型安全性を重視する場面では <code>String::from()</code> を使用するとより安全です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">String 変数の変更（文字列の追加・結合・削除）</h3>



<p class="wp-block-paragraph"><code>String</code> 型の変数はヒープ領域に格納されているので文字列の追加や削除といったことが可能です。文字列の変更では、以下のようなメソッドを使用できます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>区分</th><th>メソッド・演算子</th><th>概要</th></tr></thead><tbody><tr><td>追加</td><td><code>push(char)</code></td><td>1文字（<code>char</code> 型）を末尾に追加</td></tr><tr><td>追加</td><td><code>push_str(&amp;str)</code></td><td>文字列スライス（&amp;str 型）を末尾に追加</td></tr><tr><td>追加</td><td><code>insert(index, char)</code></td><td>指定バイト位置に1文字を追加</td></tr><tr><td>追加</td><td><code>insert_str(index, &amp;str)</code></td><td>指定バイト位置に文字列スライス（<code>&amp;str</code> 型）を追加</td></tr><tr><td>結合</td><td><code>+</code> 演算子</td><td>複数の文字列を結合（右辺は参照である必要があり、左辺はムーブされるので注意）</td></tr><tr><td>結合</td><td><code>format</code> マクロ</td><td>複数の文字列を結合<br>（元の変数の所有権はムーブせずに結合可能）</td></tr><tr><td>削除</td><td><code>pop()</code></td><td>末尾の1文字を削除<br>（<code>Option&lt;char&gt;</code> 型で返却）</td></tr><tr><td>削除</td><td><code>remove(index)</code></td><td>指定バイト位置の1文字を削除</td></tr><tr><td>削除</td><td><code>truncate(index)</code></td><td>指定バイト位置以降を削除</td></tr><tr><td>削除</td><td><code>clear()</code></td><td>文字列を全て削除</td></tr></tbody></table></figure>



<h4 class="wp-block-heading jinr-heading d--bold">文字列の追加</h4>



<p class="wp-block-paragraph">文字列の追加では、<code><span class="jinr-d--text-color d--marker1 d--bold">push</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">push_str</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">insert</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">insert_str</span></code> メソッドを使用できます。</p>



<ul class="wp-block-list jinr-list">
<li><code>push</code>：末尾に 1 文字追加します。</li>



<li><code>push_str</code>：末尾に文字列を追加します。</li>



<li><code>insert</code>：指定バイト位置に 1 文字追加します。</li>



<li><code>insert_str</code>：指定バイト位置に文字列を追加します。</li>
</ul>



<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() {
    // push(char) で1文字末尾に追加
    let mut s1 = String::from("HelloWorld");
    s1.push('!');
    println!("{}", s1);

    // push_str(&amp;str) で文字列スライスを末尾に追加
    let mut s2 = String::from("Hello");
    s2.push_str("World!");
    println!("{}", s2);

    // insert(index, char) で指定バイト位置に1文字を追加
    let mut s3 = String::from("HeloWorld!");
    s3.insert(3, 'l');
    println!("{}", s3);

    // insert_str(index, &amp;str) で指定バイト位置に文字列スライスを追加
    let mut s4 = String::from("Helrld!");
    s4.insert_str(3, "loW");
    println!("{}", s3);
}</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="">【実行結果】
HelloWorld!
HelloWorld!
HelloWorld!
HelloWorld!</pre>



<h4 class="wp-block-heading jinr-heading d--bold">文字列の結合</h4>



<p class="wp-block-paragraph">文字列の結合では、<span class="jinr-d--text-color d--marker1 d--bold"><code>+</code> 演算子</span>か <span class="jinr-d--text-color d--marker1 d--bold"><code>format</code> マクロ</span>を使用できます。</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");
    let s2 = String::from("World");
    
    // s1 の所有権はムーブするので注意、s2 は参照を渡す必要がある
    let s3 = s1 + &amp;s2;
    println!("{}", s3);

    // s1 の所有権は移動するので以下はコンパイルエラー
    // println!("{}", s1);

    // format マクロで結合する（ムーブなしで結合可能）
    let s1 = String::from("Hello");
    let s2 = String::from("World");

    // format で結合
    let s3 = format!("{}{}", s1, s2);
    println!("{}", s3);
    // ムーブしないので元の変数も使用できる。
    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="">【実行結果】
HelloWorld
HelloWorld
Hello
World</pre>



<p class="wp-block-paragraph"><code>+</code> 演算子の場合、左辺の変数の所有権はムーブするため、以降では使えなくなるので注意が必要です。また、右辺の変数は参照を渡す必要があります。</p>



<p class="wp-block-paragraph">一方、<code>format</code> マクロで結合する場合には、元の変数の所有権を保持したまま <code>String</code> を生成するため、結合後も元の変数を使用することができます。また、<code>format</code> マクロは内部的には参照として処理されるため、変数はそのまま渡すことができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">文字列の削除</h4>



<p class="wp-block-paragraph">文字列の削除では、<code><span class="jinr-d--text-color d--marker1 d--bold">pop</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">remove</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">truncate</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">clear</span></code> メソッドを使用できます。</p>



<ul class="wp-block-list jinr-list">
<li><code>pop</code>：末尾から1文字を削除し、<code>Option&lt;char&gt;</code> で削除した文字列を返します。</li>



<li><code>remove</code>：指定したバイト位置の 1 文字を削除し、<code>char</code> 型を返します。</li>



<li><code>truncate</code>：指定したバイト位置以降を削除します。返却値はありません。</li>



<li><code>clear</code>：文字列の全てを削除します。</li>
</ul>



<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() {
    let mut s = String::from("HelloWorld");
    
    // pop() で末尾の文字を取得
    match s.pop() {
        Some(c) => println!("pop: {}", c),
        None => println!("文字列が空なので取り出せません"),
    }
    println!("s: {}", s);

    // remove(index) で指定バイト位置の1文字を削除
    let c = s.remove(1);
    println!("remove idx:{}, removed:{}", 1, c);
    println!("s: {}", s);

    // truncate で指定バイト位置以降を削除
    s.truncate(4);
    println!("s: {}", s);

    // 文字列を全て削除する
    s.clear();
    println!("s: {}", s);
}</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="">【実行結果】
pop: d
s: HelloWorl
remove idx:1, removed:e
s: HlloWorl
s: Hllo
s:</pre>



<p class="wp-block-paragraph">返却値の有無や型が異なっているので取り出し方がそれぞれ異なっています。なお、<code>remove</code> や <code>truncate</code> は、<code>Option</code> 型のような安全な型を返すメソッドではないため、範囲外インデックスを指定すると実行時に <code>panic</code> を引き起こし、プログラムが異常終了します。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>insert</code>、<code>remove</code>、<code>truncate</code> はバイト位置であることに注意</h4>



<p class="wp-block-paragraph"><code>insert</code>、<code>remove</code>、<code>truncate</code> といったメソッドは、位置の指定がバイト位置となっています。そのため、マルチバイト文字を含む場合で、マルチバイト文字の途中のバイト位置を指定すると <code>panic</code> で実行時にエラーとなるので注意が必要です。</p>



<p class="wp-block-paragraph">マルチバイト文字を含む場合は、以下のように <code>char_indices()</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() {
    // バイト位置を指定する場合は、マルチバイト文字の時に注意
    // ===== insert の場合
    let mut s1 = String::from("Rust、こんにちは。");

    // 以下は panic となる
    // s1.insert(5, '!');

    // 文字数でバイト位置を検索してからであれば安全
    if let Some((idx, _)) = s1.char_indices().nth(10) {
        s1.insert(idx, '!');
    }
    println!("{}", s1);

    // ===== remove の場合
    let mut s2 = String::from("Rust、こんにちは。");

    // 以下は panic となる
    // s1.remove(5);

    // 文字数でバイト位置を検索してからであれば安全
    if let Some((idx, _)) = s2.char_indices().nth(4) {
        s2.remove(idx);
    }
    println!("{}", s2);

    // ===== truncate の場合
    let mut s3 = String::from("Rust、こんにちは。");

    // 以下は panic となる
    // s3.truncate(5);

    // 文字数でバイト位置を検索してからであれば安全
    if let Some((idx, _)) = s3.char_indices().nth(4) {
        s3.truncate(idx);
    }
    println!("{}", s3);
}</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="">【実行結果】
Rust、こんにちは!。
Rustこんにちは。
Rust</pre>



<p class="wp-block-paragraph">上記例でコメントアウトしたの部分を外すと <code>panic</code> で実行時にエラーとなります。例の文字列で 5 バイト目は「<code>、</code>」の途中のバイトを指すためです。</p>



<p class="wp-block-paragraph"><code>char_indices().nth(x)</code> で <code>x</code> 文字目のバイト位置を調べることができます。このメソッドは、<code>Option</code>型で位置と文字のタプルを取得でき、<code>match</code> や <code>if let</code> を使えば安全に処理できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型の内部構造</h3>



<p class="wp-block-paragraph"><code>String</code> 型の変数は、ヒープ領域に確保されることが特徴ですが、後ほど説明する文字列スライスとの違いを明確に理解するために、内部構造を理解しましょう。<code>String</code> 型の変数は、スタック上に以下の内容を含む情報を格納しています。</p>



<ul class="wp-block-list jinr-list">
<li>ヒープアドレス上の先頭アドレス（8バイト）</li>



<li>ヒープ上で使用中のバイト数（8バイト）</li>



<li>ヒープ上で確保済のバイト数（8バイト）</li>
</ul>



<p class="wp-block-paragraph">このように <code>String</code> 型は 8 バイト × 3 の 24 バイト で構成される変数としてスタックのメモリ領域を使用します。概要イメージとしては以下のようになっており、実際の文字列はヒープ領域に格納されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1003" height="440" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37.png" alt="String 型の内部構造" class="wp-image-877" style="width:630px;height:auto" srcset="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37.png 1003w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37-300x132.png 300w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37-768x337.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></figure>
</div>


<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="">use std::mem;

fn main() {
    let s1 = String::from("HelloWorld");
    let s2 = String::from("Rust こんにちは！");

    println!("===========================================");
    println!("s1 の文字列の内容: {}", s1);
    println!("s1 のスタック上のアドレス: {:p}", &amp;s1);
    println!("ポインタ: {:p}", s1.as_ptr());
    println!("長さ: {}", s1.len());
    println!("容量: {}", s1.capacity());
    println!("String のサイズ（byte）: {}", mem::size_of_val(&amp;s1));
    println!("===========================================");
    println!("s2 の文字列の内容: {}", s2);
    println!("s2 のスタック上のアドレス: {:p}", &amp;s2);
    println!("ポインタ: {:p}", s2.as_ptr());
    println!("長さ: {}", s2.len());
    println!("容量: {}", s2.capacity());
    println!("String のサイズ（byte）: {}", mem::size_of_val(&amp;s2));
    println!("===========================================");
}</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="">【実行結果】
===========================================
s1 の文字列の内容: HelloWorld
s1 のスタック上のアドレス: 0xddb70ff510
ポインタ: 0x2655f95eff0
長さ: 10
容量: 10
String のサイズ（byte）: 24
===========================================
s2 の文字列の内容: Rust こんにちは！
s2 のスタック上のアドレス: 0xddb70ff528
ポインタ: 0x2655f95f2f0
長さ: 23
容量: 23
String のサイズ（byte）: 24
===========================================</pre>



<p class="wp-block-paragraph">上記例では、<code>s1</code> と <code>s2</code> という <code>String</code> 型の変数を用意し、内部の情報を調べています。</p>



<p class="wp-block-paragraph">まず、変数のスタック上のアドレス（<code>&amp;s1</code> と <code>&amp;s2</code>）は、<code>println!</code> で <code>{:p}</code> とすることで確認できます。また、<code>std::mem::size_of_val(&amp;s1)</code> により具体的なメモリ上の大きさを調べられます。 これにより、<code>String</code> 型の変数がスタック上で 24 バイトのメモリを確保していることを確認できます。</p>



<p class="wp-block-paragraph"><code>String</code> 型を構成する、ヒープ領域の先頭アドレス値は <code>as_ptr()</code> メソッド、長さは <code>len()</code> メソッド、容量は <code>capacity()</code> メソッドで確認することができます。上記例では、長さと容量が一致していますが、コンパイラが長さに対して余裕をもって確保することが多いです。</p>



<h2 class="wp-block-heading jinr-heading d--bold">文字列スライス（<code>&amp;str</code> 型）</h2>



<h3 class="wp-block-heading jinr-heading d--bold">文字列スライス（<code>&amp;str</code> 型）とは</h3>



<p class="wp-block-paragraph">Rust において、<span class="jinr-d--text-color d--marker1 d--bold">文字列スライス（<code>&amp;str</code>）</span>は、UTF-8 でエンコードされた文字列の一部または全体を参照するための型です。これは、借用（参照）型であり、データの所有権を持ちません。データの本体は静的領域やヒープ領域に存在し、&amp;str はそこへのポインタと長さを持つだけの軽量な構造を持っています</p>



<p class="wp-block-paragraph">プログラム上の文字列リテラル（例：<code>"HelloWorld"</code>）は、プログラムの静的領域に格納されており、型は <code>&amp;'static str</code> 型です。ここで、<code>'static</code> は静的なライフタイムを表しており、プログラムの開始から終了までのライフタイムを持つ型であることを示しています。</p>



<p class="wp-block-paragraph">また、<code>String</code> 型の変数は、<code>&amp;str</code> 型に暗黙的に変換することができるため、関数等で <code>&amp;str</code> 型を引数として受け取る設計にすることで、文字列リテラルでも <code>String</code> 型でも扱う関数とすることができます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">文字列スライス（<code>&amp;str</code> 型）の使い方</h3>



<p class="wp-block-paragraph"><code>&amp;str</code> 型は、以下のような状況でよく使用されます。</p>



<ul class="wp-block-list jinr-list">
<li>文字列リテラルとして使用する</li>



<li>文字列リテラルや <code>String</code> からの部分文字列として使用する</li>



<li>関数の引数として、汎用的に文字列を受け入れる</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() {
    let s = "HelloWorld";
    println!("s: {}", s);
}</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="">【実行結果】
s: HelloWorld</pre>



<h4 class="wp-block-heading jinr-heading d--bold">文字列リテラルや <code>String</code> の部分文字列として使用する</h4>



<p class="wp-block-paragraph">文字列スライスは、スライスという名の通り、文字列リテラルや <code>String</code> の部分文字列への参照を取得することができます。文字列リテラルや <code>String</code> の <code>s</code> があった時に <code>&amp;s[開始..終了]</code> のように部分文字列の範囲を指定します。</p>



<p class="wp-block-paragraph">開始と終了はバイト位置で、終了位置の文字は含まないことに注意してください。また、開始を省略して <code>[..終了]</code> すると開始から終了位置までの文字列を、終了を省略して <code>[開始..]</code> とすると開始位置から終了までの文字列を取得できます。なお、<code>[..]</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 = "HelloWorld";
    let s2 = String::from("HelloWorld");

    let s1_part = &amp;s1[2..5];
    let s2_part = &amp;s2[5..];
    println!("s1_part: {}", s1_part);
    println!("s2_part: {}", s2_part);
}</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="">【実行結果】
s1_part: llo
s2_part: World</pre>



<p class="wp-block-paragraph">文字列スライスもバイト位置を指すことから、 <code>String</code> の注意事項と同様に、マルチバイト文字の途中のバイト位置を指定すると <code>panic</code> が発生します。事前に <code>char_indices()</code> を使用してバイト位置を確認してから処理すると安全です。 </p>



<h4 class="wp-block-heading jinr-heading d--bold">関数の引数として、汎用的に文字列を受け入れる</h4>



<p class="wp-block-paragraph">関数の引数として文字列を受け取る場合にも、<code>&amp;str</code> 型をよく使用します。<code>String</code> 型の参照は、自動で <code>&amp;str</code> へ変換されるため、以下の例では <code>String</code> の参照である <code>&amp;s2</code> についても <code>show_str</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 show_str(s: &amp;str) {
    println!("{}", s);
}

fn main() {
    let s1 = "HelloWorld";
    let s2 = String::from("HelloWorld");

    show_str(&amp;s1);
    show_str(&amp;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="">【実行結果】
HelloWorld
HelloWorld</pre>



<h3 class="wp-block-heading jinr-heading d--bold">文字列スライス <code>&amp;str</code> 型の内部構造</h3>



<p class="wp-block-paragraph"><code>&amp;str</code> 型の変数は、静的領域に格納される文字列リテラル、またはヒープ領域に格納される <code>String</code> を指しています。内部構造としては、<code>&amp;str</code> 型の変数は、スタック上に以下の内容を含む情報を格納しています。</p>



<ul class="wp-block-list jinr-list">
<li>文字列が格納されている先頭アドレス（8バイト）</li>



<li>スライスのバイト数（8バイト）</li>
</ul>



<p class="wp-block-paragraph">このように <code>&amp;str</code> 型は 8 バイト × 2 の 16 バイト で構成される変数としてスタックのメモリ領域を使用します。概要イメージとしては以下のようになっており、文字列の実体は、文字列リテラルの場合は静的領域に、<code>String</code> の場合はヒープ領域に格納されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="1003" height="824" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38.png" alt="&amp;str 型の内部構造" class="wp-image-901" style="width:630px" srcset="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38.png 1003w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38-300x246.png 300w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38-768x631.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></figure>
</div>


<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="">use std::mem;

fn main() {
    let s1 = "HelloWorld";
    let s2 = String::from("Rust こんにちは！");
    let s2_slice = &amp;s2[..];

    println!("===========================================");
    println!("s1 の文字列の内容: {}", s1);
    println!("s1 のスタック上のアドレス: {:p}", &amp;s1);
    println!("ポインタ: {:p}", s1.as_ptr());
    println!("長さ: {}", s1.len());
    println!("&amp;str のサイズ（byte）: {}", mem::size_of_val(&amp;s1));
    println!("===========================================");
    println!("s2_slice の文字列の内容: {}", s2_slice);
    println!("s2_slice のスタック上のアドレス: {:p}", &amp;s2_slice);
    println!("ポインタ: {:p}", s2_slice.as_ptr());
    println!("長さ: {}", s2_slice.len());
    println!("&amp;str のサイズ（byte）: {}", mem::size_of_val(&amp;s2_slice));
    println!("===========================================");
}</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="">【実行結果】
===========================================
s1 の文字列の内容: HelloWorld
s1 のスタック上のアドレス: 0x80d46ff2c8
ポインタ: 0x7ff61530b4f0
長さ: 10
&amp;str のサイズ（byte）: 16
===========================================
s2_slice の文字列の内容: Rust こんにちは！
s2_slice のスタック上のアドレス: 0x80d46ff2f0
ポインタ: 0x26c1d91f010
長さ: 23
&amp;str のサイズ（byte）: 16
===========================================</pre>



<p class="wp-block-paragraph">上記例では、文字列リテラルである <code>s1</code> と <code>String</code> <code>s2</code>の参照としての <code>s2_slice</code> の <code>&amp;str 型</code>で内部情報を取得して表示しています。</p>



<p class="wp-block-paragraph">上記例の <code>s1.as_ptr()</code> は静的領域を、<code>s2_slice.as_ptr()</code> はヒープ領域を指すアドレスとなっています。また、<code>std::mem::size_of_val()</code> により取得できるバイト数が 16 であることから、<code>&amp;str</code> 型のスタック上でのメモリサイズが 16 バイトであることが確認できます。</p>



<div id="nkhn3-2193957477" class="nkhn3--2 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">まとめ</h2>



<p class="wp-block-paragraph">Rust で文字列を扱うための <code>String</code> と <code>&amp;str</code> の基本的な使い方と内部的な構造の違いについても詳しく説明しました。</p>



<p class="wp-block-paragraph">動的な操作には <code>String</code> を、参照だけで十分な場合は  <code>&amp;str</code> を使うなど、用途に応じた選択ができるようになることが重要です。また、各種メソッドなどについても紹介しましたが、マルチバイト文字を含む場合のバイト位置指定の扱いには十分に注意し、<code>char_indices()</code> を活用した安全な操作を心がけましょう。</p>



<p class="wp-block-paragraph">文字列操作は、どのようなプログラミング言語においても非常に重要な要素です。<code>String</code> と <code>&amp;str</code> について、基本をしっかり押さえてプログラミングできるようになりましょう。</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/string-str" 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-3645624445" 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-string-str-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Rust入門】構造体の使い方を分かりやすく解説</title>
		<link>https://rust-tech.nkhn37.net/rust-structs-basic/</link>
					<comments>https://rust-tech.nkhn37.net/rust-structs-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 25 Jul 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[impl]]></category>
		<category><![CDATA[struct]]></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=393</guid>

					<description><![CDATA[Rust における構造体（struct）の使い方の基本について初心者にも分かりやすく解説します。 Rust の構造体（struct） 構造体（struct）とは Rust では、複数の値を1つにまとめて扱う構造体（str [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rust における<span class="jinr-d--text-color d--marker1 d--bold">構造体（<code>struct</code>）</span>の使い方の基本について初心者にも分かりやすく解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Rust の構造体（<code>struct</code>）</h2>



<h3 class="wp-block-heading jinr-heading d--bold">構造体（<code>struct</code>）とは</h3>



<p class="wp-block-paragraph">Rust では、複数の値を1つにまとめて扱う<span class="jinr-d--text-color d--marker1 d--bold">構造体（<code>struct</code>）</span>が重要な要素です。これは、オブジェクト指向言語におけるクラスのような役割をします。</p>



<p class="wp-block-paragraph">ただし、Rust にはクラス構文は存在しません。Rust は「安全性と柔軟性の両立」を重視したプログラミング言語であり、継承を使わずに構造体（<code>struct</code>）と実装（<code>impl</code>）、トレイト（<code>trait</code>）を組み合わせることでクラスのような柔軟な振る舞いを実現しています。</p>



<p class="wp-block-paragraph">この記事では、Rust の構造体の基本的な使い方から便利な初期化方法、メソッド定義、所有権の考え方まで初心者にも分かりやすく解説します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">構造体の定義方法とインスタンス化</h3>



<h4 class="wp-block-heading jinr-heading d--bold">構造体の定義方法</h4>



<p class="wp-block-paragraph">Rust の構造体は、自分で定義する「型」の一種です。複数の異なるデータ型の値を1つにまとめることができるデータ型として扱うことができます。</p>



<p class="wp-block-paragraph">例えば、人物の情報を表現する場合には以下のように <code>Person</code> 構造体を定義できます。</p>



<p class="wp-block-paragraph">[<code>person.rs</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="">// Person構造体を定義
#[derive(Debug)]
struct Person {
    first_name: String,
    last_name: String,
    sex: String,
    age: u32,
    birthday: String,
}

fn main() {
    // Personをインスタンスを作成する
    let person = Person {
        first_name: String::from("太郎"),
        last_name: String::from("山田"),
        sex: String::from("男性"),
        age: 25,
        birthday: String::from("2000-01-01"),
    };

    // 各要素にアクセスする
    println!(
        "{}{}さん({})は、{}歳で誕生日は{}です。",
        person.last_name, person.first_name, person.sex, person.age, person.birthday
    );
    // Debugフォーマットで表示する
    println!("{:?}", person);
}</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="">【実行結果】
山田太郎さん(男性)は、25歳で誕生日は2000-01-01です。
Person { first_name: "太郎", last_name: "山田", sex: "男性", age: 25, birthday: "2000-01-01" }</pre>



<p class="wp-block-paragraph">構造体は <code><span class="jinr-d--text-color d--marker1 d--bold">struct</span></code> キーワードを使って構造体名を定義します。Rust では構造体名には <code>UpperCamelCase</code> という各単語の頭文字を大文字にして単語をつなげる形式が慣習です。</p>



<p class="wp-block-paragraph">構造体が持つ各要素（<code>first_name</code> など）のことをフィールドと言いますが、フィールドは「<code>フィールド名: 型</code>」という形で定義します。構造体のインスタンスを作成する際には、<code>let person</code> のところで定義しているように「<code>フィールド名: 値</code>」という形で列挙します。</p>



<p class="wp-block-paragraph">構造体の各要素にアクセスしたい場合には、<code>person.first_name</code> のように「<code>インスタンス名.フィールド名</code>」でアクセスすることが可能です。</p>



<p class="wp-block-paragraph">また、構造体の定義では <code>[derive(Debug)]</code> という記載をつけることで、<code>Debug</code> フォーマットでの表示ができます。<code>println!</code> マクロにおいて <code>{:?}</code> とすると、この部分に定義した構造体の各情報を自動でフォーマットして表示してくれます。<code>[derive(Debug)]</code> は、<code>Debug</code> トレイトを自動実装してくれる便利な機能ですので覚えておいてください。</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">トレイトの基本については以下を参考にしてください。トレイトの自動実装 <code>#[derive()]</code> についても説明しています。</p>



<p class="wp-block-paragraph"><a href="https://rust-tech.nkhn37.net/rust-trait-basic/" target="_blank" rel="noreferrer noopener">【Rust入門】トレイトの基本を分かりやすく解説</a></p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">構造体は全体が「mutable」または「immutable」</h4>



<p class="wp-block-paragraph">Rust では、変数は基本的に不変（immutable）です。これは、Rust の安全性を高める仕組みで値を変更する変数は、プログラマが明示的に <code>mut</code> キーワードで明示する必要があります。</p>



<p class="wp-block-paragraph">Rust の構造体では、構造体全体が「可変（mutable）」か「不変（immutable）」かを指定します。フィールド単位ではなく、構造体単位で可変性が決まる点に注意しましょう。</p>



<p class="wp-block-paragraph">[<code>mutable_immutable.rs</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="">// Person 構造体の定義は同じなので省略

fn main() {
    // 可変 (mutable) で変数を定義
    let mut person1 = Person {
        first_name: String::from("太郎"),
        last_name: String::from("山田"),
        sex: String::from("男性"),
        age: 24,
        birthday: String::from("2000-01-01"),
    };
    // 値の変更はOK
    person1.age += 1;
    println!(
        "{} {} {} {} {}",
        person1.last_name, person1.first_name, person1.sex, person1.age, person1.birthday
    );

    // 不変 (immutable) で変数を定義
    let person2 = Person {
        first_name: String::from("花子"),
        last_name: String::from("山田"),
        sex: String::from("女性"),
        age: 20,
        birthday: String::from("2005-01-01"),
    };
    println!(
        "{} {} {} {} {}",
        person2.last_name, person2.first_name, person2.sex, person2.age, person2.birthday
    );

    // 値の変更はできない (コンパイルエラー)
    // person2.age += 1;
}
</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="">【実行結果】
山田 太郎 男性 25 2000-01-01
山田 花子 女性 20 2005-01-01</pre>



<p class="wp-block-paragraph">上記の例で、<code>person2</code> は immutable なので、<code>person2.age += 1;</code> の行のコメントアウトを外すとコンパイルエラーとなります。</p>



<p class="wp-block-paragraph">Rust では、このように構造体全体で可変性を統一することで一貫性を保証しています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">様々な初期化方法</h3>



<p class="wp-block-paragraph">構造体を定義し、インスタンスを初期化する際には便利な初期化方法があるので紹介します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">フィールドと変数が同名のとき（フィールド初期化省略記法）</h4>



<p class="wp-block-paragraph">関数 <code>create_person</code> に変数を渡して構造体をインスタンス化し、返却する場合を考えてみます。この時、通常は以下のように記載します。</p>



<p class="wp-block-paragraph">[<code>field_init.rs</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 create_person(
    first_name: String,
    last_name: String,
    sex: String,
    age: u32,
    birthday: String,
) -> Person {
    // Person インスタンスを生成して返却する
    Person {
        first_name: first_name,
        last_name: last_name,
        sex: sex,
        age: age,
        birthday: birthday,
    }
}</pre>



<p class="wp-block-paragraph">この例では「<code>first_name: first_name</code>」のように毎回同じ記載をするのが面倒です。このようにフィールド名と変数名が同じ場合のために Rust では「<span class="jinr-d--text-color d--marker1 d--bold">フィールド初期化省略記法</span>」というものが用意されており「<code>フィールド名: 変数名</code>」の部分を以下のように省略できます。</p>



<p class="wp-block-paragraph">[<code>field_init_shorthand.rs</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 create_person(
    first_name: String,
    last_name: String,
    sex: String,
    age: u32,
    birthday: String,
) -> Person {
    // フィールド初期化省略記法
    Person {
        first_name,
        last_name,
        sex,
        age,
        birthday,
    }
}</pre>



<h4 class="wp-block-heading jinr-heading d--bold">他のインスタンスからインスタンスを生成（構造体更新記法）</h4>



<p class="wp-block-paragraph">同様のフィールド値がある場合に毎回構造体の定義を書くのは大変です。そのような際に、既存の構造体インスタンスをもとに、新しいインスタンスを作成する<span class="jinr-d--text-color d--marker1 d--bold">構造体更新記法</span>があります。構造体更新記法では「<code>..</code>」を使用して以下のように定義できます。</p>



<p class="wp-block-paragraph">[<code>update_syntax.rs</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 person1 = Person {
        first_name: String::from("太郎"),
        last_name: String::from("山田"),
        sex: String::from("男性"),
        age: 25,
        birthday: String::from("2000-01-01"),
    };

    // 構造体更新記法で新しいインスタンスを生成する
    let person2 = Person {
        first_name: String::from("花子"),
        sex: String::from("女性"),
        ..person1
    };

    println!(
        "{}{}さん({})は、{}歳で誕生日は{}です。", 
        person2.last_name, person2.first_name, person2.sex, person2.age, person2.birthday
    );
}</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="">【実行結果】
山田花子さん(女性)は、25歳で誕生日は2000-01-01です。</pre>



<h5 class="wp-block-heading jinr-heading d--bold">構造体更新記法で注意が必要なこと</h5>



<p class="wp-block-paragraph">構造体更新記法を紹介しましたが、この方法は注意すべき点があります。それは、省略したフィールドのうち <code>Copy</code> トレイトが実装されていない型の場合は、所有権の移動が起こってしまうということです。上記で <code>person2</code> を作成した後、以下のコードを書いてみてください。</p>



<p class="wp-block-paragraph">[<code>update_syntax_move.rs</code>]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="5, 8" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    // 一部フィールドでも所有権の移動が起こると構造体本体を使用できない。
    // ただし、個々のフィールドについては Copy トレイトの実装有無で挙動が異なる
    //  - Copy トレイトが実装されている場合: フィールドの値がコピーされるので使用できる
    //  - Copy トレイトが実装されていない場合: フィールドの所有権が移動するので使用不可

    // 以下のコメントアウトを外すとコンパイルエラー
    // println!("{:?}", person1);
    println!("{}", person1.first_name);
    // println!("{}", person1.last_name);
    println!("{}", person1.sex);
    println!("{}", person1.age);
    // println!("{}", person1.birthday);</pre>



<p class="wp-block-paragraph"><code>person1</code> のフィールドのうち、<code>last_name</code> と <code>birthday</code> はアクセスできなくなっており、コンパイルエラーとなります。これは、構造体更新記法により所有権が移動しているためです。また、一部でもフィールドの所有権移動が起こると構造体本体の <code>person1</code> へはアクセスできなくなります。</p>



<p class="wp-block-paragraph">一方で、<code>age</code> は <code>u32</code> 型の基本型で <code>Copy</code> トレイトが実装されているため <code>person2</code> のフィールドにコピーされるため、<code>person1.age</code> のように個別に指定すれば引き続きアクセスが可能です。</p>



<p class="wp-block-paragraph">このように <code>String</code> や <code>Vec</code> のように<span class="jinr-d--text-color d--marker1 d--bold">所有権が移動する型をフィールドに含むような構造体の場合には構造体更新記法の使用は注意が必要</span>です。例えば、以下の <code>Rectangle</code> 型の例のように基本型のみを含むような構造体の場合は、全てコピーになるので安心して使用できます。</p>



<p class="wp-block-paragraph">[<code>update_syntax_save.rs</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="">// 矩形構造体 Rectangle
struct Rectangle {
    width: u32,
    height: u32,
    color_code: u8,
}

fn main() {
    let rect1 = Rectangle {
        width: 100,
        height: 50,
        color_code: 1,
    };

    // 構造体更新記法で新しいインスタンスを生成する
    // 基本型ばかりなのでコピーになる
    let rect2 = Rectangle {
        color_code: 2,
        ..rect1
    };

    // rect1 のフィールドにもアクセスできる
    println!("矩形1 widhth:{}, height:{}, color_code:{}", rect1.width, rect1.height, rect1.color_code);
    println!("矩形2 widhth:{}, height:{}, color_code:{}", rect2.width, rect2.height, rect2.color_code);
}</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="">【実行結果】
矩形1 widhth:100, height:50, color_code:1
矩形2 widhth:100, height:50, color_code:2</pre>



<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">タプル構造体</span>とは、フィールド名を持たない構造体で、シンプルなデータ構造の定義に適しています。各フィールドの意味が明確で、名前を付ける必要がない、もしくは名前付けすることで冗長になってしまうようなケースでよく使用されます。</p>



<p class="wp-block-paragraph">よく例で紹介される <code>Color</code> や <code>Point</code> を使って見てみましょう。</p>



<p class="wp-block-paragraph">[<code>tuple_struct.rs</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="">// Color タプル構造体
struct Color(u8, u8, u8);
// Point タプル構造体
struct Point(i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0);

    println!("黒 = ({}, {}, {})", black.0, black.1, black.2);
    println!("原点 = ({}, {})", origin.0, origin.1);
}</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="">【実行結果】
黒 = (0, 0, 0)
原点 = (0, 0)</pre>



<p class="wp-block-paragraph">このように <code>Color</code> や <code>Point</code> は、RGB や X軸, Y軸 のように順序と意味が慣例で明確なのでタプル構造体で定義することに適しています。なお、通常の構造体定義では <code>{}</code> であったのが、タプル構造体では <code>()</code> になっているので注意しましょう。</p>



<div id="nkhn3-2652649798" 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">構造体のメソッド</h2>



<p class="wp-block-paragraph">Rust では、構造体に関連付けられた関数を「<span class="jinr-d--text-color d--marker1 d--bold">メソッド（method）</span>」と呼びます。これは <code><span class="jinr-d--text-color d--marker1 d--bold">impl</span></code> ブロックの中で定義され、<code><span class="jinr-d--text-color d--marker1 d--bold">self</span></code> を引数に取ることが特徴です。</p>



<p class="wp-block-paragraph">[<code>method.rs</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="">// Person 構造体の定義は同じなので省略

impl Person {
    // あいさつをするメソッド
    fn greet(&amp;self) {
        println!(
            "こんにちは。{}{}と言います。{}歳の{}で、誕生日は{}です。",
            self.last_name, self.first_name, self.age, self.sex, self.birthday,
        );
    }

    // 氏名を返却するメソッド
    fn full_name(&amp;self) -> String {
        format!("{}{}", self.last_name, self.first_name)
    }

    // 年齢を比較するメソッド (self以外の引数をとる場合)
    fn is_older_than(&amp;self, other_age: u32) -> bool {
        self.age > other_age
    }

    // 誕生日で年齢を+1するメソッド (可変参照とする場合)
    fn have_birthday(&amp;mut self) {
        self.age += 1;
    }

    // 新しいPersonインスタンスを生成する (関連関数という)
    fn new(first_name: &amp;str, last_name: &amp;str, sex: &amp;str, age: u32, birthday: &amp;str) -> Person {
        Person {
            first_name: first_name.to_string(),
            last_name: last_name.to_string(),
            sex: sex.to_string(),
            age,
            birthday: birthday.to_string(),
        }
    }
}

fn main() {
    // 関連関数を使って Person のインスタンスを作成
    let mut person = Person::new("太郎", "山田", "男性", 25, "2000-01-01");

    // greet メソッドの呼び出し
    person.greet();

    // full_name メソッドの呼び出し
    let full_name = person.full_name();
    println!("フルネーム: {}", full_name);

    // is_older_than メソッドの呼び出し
    let other_age = 30;
    if person.is_older_than(other_age) {
        println!("{}歳より年上です。", other_age);
    } else {
        println!("{}歳より年下です。", other_age);
    }

    // 誕生日を迎えたので have_birthday を呼び出し
    person.have_birthday();
    println!("誕生日を迎えて、{}歳になりました。", person.age);
}
</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="">【実行結果】
こんにちは。山田太郎と言います。25歳の男性で、誕生日は2000-01-01です。
フルネーム: 山田太郎
30歳より年下です。
誕生日を迎えて、26歳になりました。</pre>



<p class="wp-block-paragraph">メソッドでは、第1引数に <code>self</code> という自身を指す変数を取る必要があります。値を参照するのみの場合は、不変参照（<code>&amp;self</code>）を引数に取れば十分ですが、構造体のフィールドを書き換えるような場合には、可変参照（<code>&amp;mut self</code>）を受け取る必要があります。</p>



<p class="wp-block-paragraph">また、通常の関数と同様に値の返却（<code>full_name</code> メソッド）や他の引数を受け取る（<code>is_older_than</code> メソッド）ということもできます。</p>



<p class="wp-block-paragraph">なお、<code>self</code> を引数に取らない <code>new</code> のような関数を<span class="jinr-d--text-color d--marker1 d--bold">関連関数</span>と言います。関連関数は、構造体のインスタンスを必要とせずに呼び出せる関数で、<code>self</code> を引数に取らないため <code>static</code> な性質を持ちます。主に <code>new</code> 関数のようなコンストラクタ的用途や、定数の返却、型変換などのユーティリティ関数に使われます。他のオブジェクト指向言語におけるクラスの <code>static</code> メソッドに相当します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">構造体の所有権</h2>



<p class="wp-block-paragraph">Rustでは、構造体全体が1つの所有権を持ち、変数間の代入によって所有権全体が移動します。</p>



<p class="wp-block-paragraph">[<code>ownership_borrowing.rs</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="">// Person 構造体の定義は同じなので省略

// メソッドの実装 (impl Person) は同じなので省略

fn main() {
    let person1 = Person::new("太郎", "山田", "男性", 25, "2000-01-01");

    // 所有権が移動する
    let person2 = person1;

    // 以下はコメントアウトを外すとコンパイルエラー
    // println!("person1: {}", person1.first_name);

    // 所有権を移動させない場合は、参照を使用する
    let person3 = &amp;person2;
    println!("person2: {}", person2.first_name);
    println!("person3: {}", person3.first_name);
}</pre>



<p class="wp-block-paragraph">上記の例では「<code>let person2 = person1;</code>」の部分で所有権が移動するため、<code>person1</code> はフィールド値にもうアクセスできません。</p>



<p class="wp-block-paragraph">所有権を移動させない場合は、借用（不変参照 または 可変参照）を使用しますが、その時には構造体のフィールド全体が一貫して参照として扱われます。</p>



<p class="wp-block-paragraph">ただし、個々のフィールドに対して移動や借用することも可能であり、その場合は、各フィールドで所有権の扱いと借用のルールが適用されます。上記の構造体更新記法で一部の <code>String</code> の所有権が移動したような例もその1つです。</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://rust-tech.nkhn37.net/rust-ownership-borrowing-basic" target="_blank" rel="noreferrer noopener">【Rust入門】所有権と借用の基本を分かりやすく解説</a></p>
</div>
		</div></section>



<div id="nkhn3-2164919947" class="nkhn3--2 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">まとめ</h2>



<p class="wp-block-paragraph">この記事では、Rust における<span class="jinr-d--text-color d--marker1 d--bold">構造体（<code>struct</code>）</span>の基本的な使い方について解説しました。</p>



<p class="wp-block-paragraph">構造体は、複数の値をまとめて扱うデータ型として、Rust でのデータ構造の設計において非常に重要な役割を果たします。フィールドの初期化、省略記法や構造体更新記法、タプル構造体、メソッドや関連関数の定義方法などを学ぶことで、より柔軟で表現力のあるプログラムが書けるようになります。</p>



<p class="wp-block-paragraph">また、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/struct-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>


<p class="wp-block-paragraph"></p>
<div id="nkhn3-1519917569" 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-structs-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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-3280111005" 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-3789969742" 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>
		<item>
		<title>【Rust入門】関数定義の基本を分かりやすく解説</title>
		<link>https://rust-tech.nkhn37.net/rust-function-basic/</link>
					<comments>https://rust-tech.nkhn37.net/rust-function-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 17 Jul 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[deref]]></category>
		<category><![CDATA[derefmut]]></category>
		<category><![CDATA[シャドーイング]]></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=389</guid>

					<description><![CDATA[Rust における関数定義の方法について初心者にも分かりやすく解説します。 Rust 関数の基本 プログラミングにおいて関数とは、何度も使用するようなコードを1つのブロックにまとめて関数として名前付けし、何度も使うように [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rust における<span class="jinr-d--text-color d--marker1 d--bold">関数定義の方法</span>について初心者にも分かりやすく解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Rust 関数の基本</h2>



<p class="wp-block-paragraph">プログラミングにおいて<span class="jinr-d--text-color d--marker1 d--bold">関数</span>とは、何度も使用するようなコードを1つのブロックにまとめて関数として名前付けし、何度も使うようにできるものです。関数は、プログラミングにおいてどのような言語であっても中核的な役割をします。</p>



<p class="wp-block-paragraph">この記事では、Rust における関数定義や引数などの基本について分かりやすく解説します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">基本的な関数定義と呼び出し</h3>



<p class="wp-block-paragraph">Rust の関数は、<code><span class="jinr-d--text-color d--marker1 d--bold">fn</span></code> を使用して以下のように定義します。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box6  "><div class="a--simple-box-title d--bold">関数の基本構文</div><div class="c--simple-box-inner">
<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn 関数名() {
    // 関数で実行する処理
}</pre>
</div></div></section>



<p class="wp-block-paragraph">以下は、入力された整数の<code>2</code>乗を返す <code>square</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="">// 2乗を返す関数 square を定義
fn square(x: i32) -> i32 {
    x * x
}

fn main() {
    // square関数を呼び出し
    let result = square(2);
    
    println!("2 の 2乗 は {} です。", result);
}</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="">【実行結果】
2 の 2乗 は 4 です。</pre>



<p class="wp-block-paragraph">関数 <code>square</code> が受け取っている <code>x</code> を引数と言い、「: i32」の部分は引数の型を示す型注釈と言います。また、「<code>-&gt; i32</code>」の部分は、戻り値の型を示す型注釈です。Rust では関数の最後の式が戻り値となるため、戻り値として値を返す際には「<code>x * x</code>」のようにセミコロン（<code>;</code>）をつけずに記載します。引数や戻り値については以降で詳しく説明します。</p>



<p class="wp-block-paragraph">作成した関数を呼び出すときには、<code>main</code> 関数内で <code>let result = square(2);</code> としているように「<code>関数名();</code>」で何度でも呼び出すことができます。また、戻り値を <code>let</code> を使って変数に束縛することも可能です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">関数定義のルール</h3>



<p class="wp-block-paragraph">関数定義のルールについて、整理しておきましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold">型注釈は必須</h4>



<p class="wp-block-paragraph">関数では、引数の型注釈（例：<code>x: i32</code>）や戻り値の型注釈（例：<code>-&gt; i32</code>）を明示することが必須です。変数定義の時は、型推論により型が推論されますが、関数の引数の場合は異なるので注意しましょう。ただし、戻り値がないような関数の場合は「<code>-&gt;</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>()</code></div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">戻り値がない場合には、実際には「<code>-&gt; ()</code>」という戻り値が設定されています。この <code>()</code> はユニット型と言います。</p>
</div></div></section>



<h4 class="wp-block-heading jinr-heading d--bold">戻り値にはセミコロン「<code>;</code>」を付けない</h4>



<p class="wp-block-paragraph">Rust では、関数の最後の式が戻り値となります。セミコロン「<code>;</code>」を記載すると文となってしまうため、関数内で戻り値を書く場合には「<code>;</code>」を付けないように注意してください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn square(x: i32) -> i32 {
    x * x    // セミコロンを付けない
}</pre>



<h4 class="wp-block-heading jinr-heading d--bold">関数名はスネークケース（<code>snake_case</code>）が慣習</h4>



<p class="wp-block-paragraph">関数名は、小文字をアンダースコアでつなげるスネークケース（<code>snake_case</code>）で書くのがRustの慣習となっています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">戻り値と早期終了 (<code>return</code>)</h3>



<p class="wp-block-paragraph">Rust では、関数の最後の式が戻り値になることを見てきましたが、<code><span class="jinr-d--text-color d--marker1 d--bold">return</span></code> キーワードを使って明示的に値を返すことも可能です。</p>



<p class="wp-block-paragraph">以下の例では、絶対値を返却する <code>abs</code> 関数を作成し、<code>x &lt; 0</code> の場合は、その場で <code>-x</code> を <code>return</code> により返して早期終了しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn abs(x: i32) -> i32 {
    if x &lt; 0 {
        // 早期終了 (return)
        return -x;
    }
    // 通常の戻り値
    x
}

fn main() {
    // abs関数を呼び出し
    let result1 = abs(-5);
    let result2 = abs(10);

    println!("結果 result1: {}, result2: {}", result1, result2);

}</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="">【実行結果】
結果 result1: 5, result2: 10</pre>



<p class="wp-block-paragraph">関数の最後で <code>return</code> を使うのは、非常に多くの言語で見られる方法です。もちろん、Rust でも最後の戻り値で <code>return</code> を使うことができますが、Rust では、最後の戻り値では <code>return</code> を書かないことが一般的です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">関数のシャドーイング（定義の上書き）</h3>



<p class="wp-block-paragraph">Rust では、変数の定義で同じ変数名で <code>let</code> における再定義をすることができました。関数でも同じようにシャドーイングにより定義を上書きすることができます。</p>



<p class="wp-block-paragraph">関数の場合には、外側のスコープで定義した関数を、内側のスコープでシャドーイングすることで定義を上書きすることができます。<code>let</code> の時には同一スコープで再定義ができましたが、<span class="jinr-d--text-color d--marker1 d--bold">関数は同一スコープでは複数回の定義はできない</span>ので注意してください。</p>



<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 message() {
    println!("メッセージ 1");
}

fn show_message() {
    message();  // 「メッセージ 1」を表示
}

fn main() {
    message();  // 「メッセージ 2」を表示
    {
        message();  // 「メッセージ 3」を表示

        fn message() {
            println!("メッセージ 3");
        }
    }
    message();  // 「メッセージ 2」を表示
    show_message(); // show_message関数経由で「メッセージ 1」を表示

    fn message() {
        println!("メッセージ 2");
    }
}</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="">【実行結果】
メッセージ 2
メッセージ 3
メッセージ 2
メッセージ 1</pre>



<p class="wp-block-paragraph">上記の例だと、<code>message</code> という名前の関数を3回定義しています。<code>show_message</code> 関数が使用するのは「<code>メッセージ 1</code>」と表示する <code>message</code> 関数です。一方で、<code>main</code> 関数の最初のスコープでは「<code>メッセージ 2</code>」と表示する <code>message</code> 関数を、一段階内側の <code>{}</code> ブロック内での呼び出しでは「<code>メッセージ 3</code>」と表示する <code>message</code> 関数を呼び出します。</p>



<p class="wp-block-paragraph">このように、関数もスコープによってシャドーイングされる対象となります。ただし、このようにスコープ内で入れ子に関数を定義していくようなスタイルは可読性がよくありません。上記の例は、関数もシャドーイングされるという Rust の言語仕様を説明するものだと理解してください。</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">変数や定数については以下の記事も参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://rust-tech.nkhn37.net/rust-variables-constants/" target="_blank" rel="noreferrer noopener">【Rust入門】変数と定数を分かりやすく解説</a></p>
</div>
		</div></section>



<div id="nkhn3-3321440719" 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">関数の引数と戻り値の扱い</h2>



<p class="wp-block-paragraph">ここからは、関数の引数と戻り値の扱いについて、もう少し詳しく見ていきましょう。</p>



<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">仮引数（parameter）</span>」、呼び出し時に渡される引数を「<span class="jinr-d--text-color d--marker1 d--bold">実引数（argument）</span>」と言います。</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">※ 所有権を持つ型の場合は扱いが異なりますが後ほど説明しますので、今の段階ではコピーであると思ってください。</p>
</div>
		</div></section>



<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="">// x は仮引数
fn square(x: i32) -> i32 {
    x * x
}

fn main() {
    let x = 2;

    // x は実引数
    let result = square(x);
    
    println!("{} の 2乗 は {} です。", x, result);
}</pre>



<p class="wp-block-paragraph">上記の例では、<code>square</code> 関数の <code>x: i32</code> が仮引数で、main 関数内の <code>x</code> が実引数です。<code>main</code> 関数内で <code>square</code> 関数が呼び出されると <code>square</code> 関数の <code>x</code> としてコピーが作成され、<code>square</code> 関数処理がされて値を返した際に破棄されています。</p>



<p class="wp-block-paragraph">その後の <code>println!</code> で <code>x</code> を使用していますが、この値は <code>main</code> 関数で最初に定義している <code>let x = 2;</code> です。これは、C言語にもある値渡しの仕組みと同じものです。</p>



<h3 class="wp-block-heading jinr-heading d--bold">関数から値を返す</h3>



<p class="wp-block-paragraph">関数では、引数を受け取るだけではなく、処理結果を呼び出し元に返すことができます。上記の例でも見てきたように関数の戻り値は、最後の式の値になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn square(x: i32) -> i32 {
    x * x  // 戻り値となる式
}</pre>



<p class="wp-block-paragraph">関数の戻り値を表す型注釈は、関数名の後の「<code>-&gt;</code>」に続けて記載をします。例えば、戻り値がないような関数の場合は、空のタプル <code>()</code> が戻されているとみなされます。戻り値がない場合には「<code>-&gt; ()</code>」は省略可能です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">複数の値を返す</h3>



<p class="wp-block-paragraph">関数から複数の値を返却したい場合には、タプルを使用することで値を返すことができます。以下は、入力された2つの引数で <code>min</code> と <code>max</code> を計算し、<code>(min, max)</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="">// 最小(min), 最大(max) を確認し、(min, max) のタプルで返却する
fn min_max(a: i32, b: i32) -> (i32, i32) {
    if a &lt; b {
        (a, b)
    } else {
        (b, a)
    }
}

fn main() {
    let a = 10;
    let b = 5;

    let (min, max) = min_max(a, b);
    println!("min: {}, max: {}", min, max);
}</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="">【実行結果】
min: 5, max: 10</pre>



<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">タプルについては、以下の記事も参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://rust-tech.nkhn37.net/rust-basic-types/" 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">これまでの例では、実引数を関数の仮引数にコピーして処理を返して値を返すというような例を見てきました。実際には、呼び出し元の変数を直接変更したい場合も出てきます。このような場合について、Rustでは所有権という考え方を意識しないといけません。ここでは、基本型と所有権を持つ型（<code>String</code> や <code>Vec</code>）に分けて説明をします。</p>



<h4 class="wp-block-heading jinr-heading d--bold">基本型の場合</h4>



<p class="wp-block-paragraph">基本型はメモリのスタック領域に置かれる型で通常や仮引数へ渡す際にはコピーされます。呼び出し元の基本型の値を変更したい場合には、以下のように <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 increment(n: &amp;mut i32) {
    *n += 1;
}

fn main() {
    let mut num = 0;

    // 1回目の呼び出し (可変参照)
    increment(&amp;mut num);
    println!("num: {}", num);
    // 2回目の呼び出し (可変参照)
    increment(&amp;mut num);
    println!("num: {}", num);
}</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="">【実行結果】
num: 1
num: 2</pre>



<p class="wp-block-paragraph">変更が可能な参照を指定する場合には、呼び出し時に実引数には「<code>&amp;mut 変数</code>」のように渡します。一方で、受け取る関数の型注釈は「<code>: &amp;mut 型名</code>」を付けます。Rust において <code>&amp;</code> は参照を表します。そして、<code>*</code> は参照から値を取り出すための演算子です。今回は可変参照を使用しているので、値を書き換えることができます。</p>



<p class="wp-block-paragraph"><code>&amp;mut num</code> は、変数 <code>num</code> の可変な参照を渡しているので、関数 <code>increment</code> で <code>*n</code> により値を変更しています。<code>main</code> 関数で呼び出しから戻ってきた際に <code>num</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">基本型がコピーされる理由</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">基本型を関数に渡す際にコピーされるのは、基本型が <code>Copy</code> トレイトを実装しているためです。一方で後述する所有権を持つ型は <code>Copy</code> トレイトが実装されていないため基本は所有権が移動（move）します。</p>
</div></div></section>



<h4 class="wp-block-heading jinr-heading d--bold">所有権を持つ型の場合</h4>



<p class="wp-block-paragraph">基本型について見ましたが、所有権を持つ型（<code>String</code> や <code>Vec</code>）といった型では基本型と少し挙動が異なり、所有権の移動や借用（不変参照、可変参照）について意識する必要があります。</p>



<h5 class="wp-block-heading jinr-heading d--bold">所有権が移動する場合</h5>



<p class="wp-block-paragraph"><code>String</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="">// 所有権が移動 (move) する場合
fn print_str_move(s: String) {
    println!("print_str_move: {}", s);
}

fn main() {
    // 所有権の移動の確認
    let s1 = String::from("Hello World");
    print_str_move(s1);
    println!("呼び出し元のs1: {}", 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="">【実行結果】
error[E0382]: borrow of moved value: `s1`
  --> examples\arg_param_string_move.rs:10:30
   |
8  |     let s1 = String::from("Hello World");
   |         -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
9  |     print_str_move(s1);
   |                    -- value moved here
10 |     println!("呼び出し元のs1: {}", s1);
   |                                    ^^ value borrowed here after move
   |
note: consider changing this parameter type in function `print_str_move` to borrow instead if owning the value isn't necessary
  --> examples\arg_param_string_move.rs:2:22
   |
2  | fn print_str_move(s: String) {
   |    --------------    ^^^^^^ this parameter takes ownership of the value
   |    |
   |    in this function
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider cloning the value if the performance cost is acceptable
   |
9  |     print_str_move(s1.clone());
   |                      ++++++++

For more information about this error, try `rustc --explain E0382`.
error: could not compile `function_basic` (example "arg_param_string_move") due to 1 previous error</pre>



<p class="wp-block-paragraph">この例では、コンパイル時にエラーとなります。これは、関数に <code>s1</code> を渡す際に所有権を関数側へ移動（<code>move</code>）しているためです。この時に、<code>"Hello World"</code> が格納されるオブジェクトは関数へ所有権が移り、関数呼び出し後に解放されてしまいます。そのため、呼び出し元で再度呼び出そうとするとエラーとなってしまいます。</p>



<p class="wp-block-paragraph">これを回避する1つの方法は、<code>help</code> に記載のように <code>clone()</code> を使用してコピーを渡すことです。以下のようにするとエラーは起こりません。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// コピーを受け取っている
fn print_str_move(s: String) {
    println!("print_str_move: {}", s);
}

fn main() {
    // 所有権の移動の確認
    let s1 = String::from("Hello World");
    
    // 所有権が移動しないようにコピーを渡す
    print_str_move(s1.clone());
    println!("呼び出し元のs1: {}", s1);
}</pre>



<p class="wp-block-paragraph">ただし、<code>String</code> や <code>Vec</code> のようにヒープ領域を使用する型はサイズが可変であることから、使用している領域が大きい可能性があり、コピーをすることは不必要なメモリ利用や応答性の低下につながる可能性があります。そのため、以降で紹介する借用（不変参照や可変参照）をうまく使用します。</p>



<h5 class="wp-block-heading jinr-heading d--bold">借用（不変参照と可変参照）</h5>



<p class="wp-block-paragraph">所有権を借用するケースについて見ていきましょう。Rust において借用には、読み取り専用の「不変参照」と変更も可能な「可変参照」があります。これらは呼び出し元で定義している変数が指すオブジェクトへの参照です。</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_str_ref(s: &amp;String) {
    println!("print_str_ref: {}", s);
}

// 可変参照 (変更可) の場合
fn print_str_change(s: &amp;mut String) {
    s.push_str("!!!");
    println!("print_str_change: {}", s);
}

fn main() {
    // 不変参照の場合
    let mut s1 = String::from("World World");
    print_str_ref(&amp;s1);

    // 可変参照の場合
    print_str_change(&amp;mut s1);
    println!("呼び出し元のs1: {}", 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="">【実行結果】
print_str_ref: World World
print_str_change: World World!!!
呼び出し元のs1: World World!!!</pre>



<p class="wp-block-paragraph">読み取り専用の不変参照で関数を定義する場合には、型注釈として「<code>: &amp;型名</code>」として定義します。関数呼び出しの際には「<code>&amp;変数名</code>」で渡します。これは、呼び出し元のオブジェクトを指していますが、読み取り専用の参照のため誤った値の変更を避けることができます。</p>



<p class="wp-block-paragraph">次に変更可の可変参照で関数を定義する場合には、型注釈として「<code>: &amp;mut 型名</code>」として定義します。関数呼び出しの際には「<code>&amp;mut 変数名</code>」で渡します。これは変更可であるため呼び出し元の変数の値を変更します。そのため、上記例で <code>main</code> 関数に戻ってきた際に <code>s1</code> の値が変わっていることが分かります。</p>



<p class="wp-block-paragraph">上記の内容は所有権の考え方をまだ学んでいない方には少し難しいかもしれません。所有権や借用については、別途詳しく説明しようと思います。</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">String で <code>*</code> がいらない理由</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記の例で <code>String</code> の参照から値にアクセスする際に <code>*</code> を使っていませんでした。これは、<code>String</code> 型が <code>Deref</code> や <code>DerefMut</code> トレイトを実装しているためです。</p>



<p class="wp-block-paragraph"><code>*</code> により参照から値を取り出すことをデリファレンスと呼びます。Rust では、<code>Deref</code> や <code>DerefMut</code> によりデリファレンスの振る舞いが定義されており、<code>String</code> 型や <code>Vec</code> 型のような型では <code>*</code> を使わなくてもいいように Rust の型システムが自動で変換してくれます。</p>
</div></div></section>



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



<p class="wp-block-paragraph">Rust の関数は、明確な型注釈や所有権のルールにも従って、安全で予測可能なコードを書くために必要なものです。この記事では、関数の基本的な定義方法から、引数と戻り値の扱い、所有権と参照の使い分けまでを学びました。</p>



<p class="wp-block-paragraph">特に、以下のポイントを押さえておきましょう。</p>



<ul class="wp-block-list jinr-list">
<li>関数の引数と戻り値には型注釈が必須（ただし、戻り値がない場合は省略可能）</li>



<li>関数の最後の式が戻り値（セミコロンをつけない）</li>



<li>所有権の移動と参照（不変・可変）の違いを理解する</li>



<li>基本型と所有権を持つ型（Stringなど）で挙動が異なる</li>
</ul>



<p class="wp-block-paragraph">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/function-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-3115883356" 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-function-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rustとは？特徴や他言語との違いまで徹底解説！</title>
		<link>https://rust-tech.nkhn37.net/rust-overview-guide/</link>
					<comments>https://rust-tech.nkhn37.net/rust-overview-guide/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 04 Jul 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[cargo]]></category>
		<category><![CDATA[rustc]]></category>
		<category><![CDATA[wasm]]></category>
		<category><![CDATA[WebAssembly]]></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=133</guid>

					<description><![CDATA[Rust は、近年注目されているモダンなプログラミング言語の一つです。この記事では、Rust が注目されている理由や、他言語と違いまで徹底的に解説します。 Rust とは何か？ Rust は、非常に高いパフォーマンスやメ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong><span class="jinr-d--text-color d--marker1 d--bold">Rust</span></strong> は、近年注目されているモダンなプログラミング言語の一つです。この記事では、Rust が注目されている理由や、他言語と違いまで徹底的に解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Rust とは何か？</h2>



<p class="wp-block-paragraph"><strong><span class="jinr-d--text-color d--marker1 d--bold">Rust</span></strong> は、非常に高いパフォーマンスやメモリ安全性など、近年人気が高まってきているモダンなプログラミング言語の 1 つです。</p>



<h3 class="wp-block-heading jinr-heading d--bold">なぜ Rust に注目が集まっているのか？</h3>



<p class="wp-block-paragraph">Rust は、なぜ近年注目を集めているのでしょうか。いくつかの理由をご紹介します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">信頼性・安全性の高い実装の実現</h4>



<p class="wp-block-paragraph">近年は、サイバーセキュリティの脅威が増加しており、攻撃者はシステムの脆弱性をついて攻撃してきます。そのため、信頼性の高いシステムを構築することが必要不可欠です。Rust では、メモリ安全性を言語レベルで保証するような仕組みがあり、<strong><span class="jinr-d--text-color d--marker1 d--bold">コンパイルが通れば、メモリ安全性の多くが保証されるため、非常に信頼性の高いシステムを構築</span></strong>できます。</p>



<p class="wp-block-paragraph">実際に、バッファオーバーフローやダングリングポインタ（解放されたメモリ領域を指すポインタ）へのアクセスなどメモリ安全性の問題は、重大な脆弱性の大半を占めるとも言われています。このように、セキュリティ要求への対応への高まりに伴い、Rust への注目と期待が高まっています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">高速性と開発効率の両立</h4>



<p class="wp-block-paragraph">これまでは、高性能な処理を実現するには C/C++ を選び、開発効率を重視する際には Python などのスクリプト言語を選ぶといった、性能と生産性のどちらを取るかという二者択一の判断を迫られることが多くありました。<strong><span class="jinr-d--text-color d--marker1 d--bold">Rust は C/C++ に匹敵する高性能を持ちながら、Python などのモダンな言語に見られる表現のしやすさや安全性も備えており、その両立を実現</span></strong>しています。</p>



<p class="wp-block-paragraph">Rust は、C/C++ と同等の性能を保ちつつ、メモリ安全性や並行性の安全性をコンパイル時に保証することを目指して設計されており、C/C++ の代替としても大きな期待を集めています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">幅広い適用範囲</h4>



<p class="wp-block-paragraph">Rust は、C/C++ に変わるシステムプログラミング言語として注目されがちですが、実は<strong><span class="jinr-d--text-color d--marker1 d--bold">様々な分野で活用できる汎用性の高いプログラミング言語</span></strong>です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>用途</th><th>概要</th></tr></thead><tbody><tr><td>組み込み開発</td><td>メモリ使用量の厳密な管理が求められる環境でも、安全性と効率性を両立した開発が可能です。</td></tr><tr><td>コマンドラインツール（CLI）開発</td><td>ライブラリと組み合わせることで、保守性が高く使いやすい CLI アプリケーションを素早く構築できます。</td></tr><tr><td>Web 開発</td><td>高速な Web フレームワークを利用することで、並行処理に強く、安全で高速な Web アプリケーション開発が可能です。</td></tr><tr><td>WebAssembly（WASM）対応</td><td>Rust は、近年登場した WebAssembly との相性が非常によく、ブラウザ上で動作する高速な処理を記述できます。</td></tr></tbody></table></figure>



<h4 class="wp-block-heading jinr-heading d--bold">エコシステムの充実</h4>



<p class="wp-block-paragraph">Rust は、言語としての素晴らしい設計思想だけではなく、開発環境やライブラリ（クレートと呼ばれます）関連の<strong><span class="jinr-d--text-color d--marker1 d--bold">エコシステムが非常に充実している</span></strong>ことも注目される理由の 1 つです。</p>



<p class="wp-block-paragraph">例えば、Rust のプロジェクト管理では標準で <strong><span class="jinr-d--text-color d--marker1 d--bold">Cargo</span></strong> というビルドツール兼パッケージマネージャが標準で用意されており、ビルド・テスト・ドキュメント生成の実行、パッケージの依存関係管理などを一貫して行うことができます。</p>



<p class="wp-block-paragraph">また、Rust のパッケージは <strong><span class="jinr-d--text-color d--marker1 d--bold"><a href="https://crates.io/" target="_blank" rel="noreferrer noopener">crates.io</a></span></strong> という公式のリポジトリを通じて簡単に検索、導入ができるようになっており、高品質かつ実用的な各種ライブラリが数多く公開されています。このように、実際の開発に必要な機能をすぐに利用できる環境が整っているため、Rust は「学習コストは高いが、開発効率も高い」と評価されることが増えてきています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">大手企業での採用</h4>



<p class="wp-block-paragraph">Rust は、その安全性・性能・開発効率の高さから、近年では Google、Microsoft、Amazon などの大手企業でも採用が進められています。例えば、Microsoft では Windows や Azure（クラウド）などのプロジェクトで Rust を積極的に評価・導入を進めています。このように世界の IT 大手企業が Rust を本番環境に導入し始めていることは、Rust の信頼性や将来性を強く示す動きと言えます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">最も称賛された言語ランキング（2025年調査）</h4>



<p class="wp-block-paragraph">Stack Overflow Developer Survey 2025 の <a href="https://survey.stackoverflow.co/2025/technology#2-programming-scripting-and-markup-languages" target="_blank" rel="noreferrer noopener">Most Admired Language</a> (最も称賛された言語) として、72.4% のスコアで 2024 年に続いて再び 1 位を獲得しています。これは、現在 Rust を使用する開発者が今後も使いたいと強く思っていることを意味しており、Rust の安全性や充実したエコシステムによる開発が開発者に受け入れられていることがよく分かります。</p>



<p class="wp-block-paragraph">また、Desired Language (=使用を望まれている言語)では、Python や Javascript といった言語にはやや劣りますが、29.2% で上位となっています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="483" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-39-1024x483.png" alt="Stack Overflow Developer Survey Admired and Desired Language" class="wp-image-1787" srcset="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-39-1024x483.png 1024w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-39-300x142.png 300w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-39-768x363.png 768w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-39.png 1038w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><a href="https://survey.stackoverflow.co/2025/technology#2-programming-scripting-and-markup-languages" target="_blank" rel="noreferrer noopener">Stack Overflow Developer Survey 2025 : Most Adimired Language</a> より引用<br>青：Desired、赤：Admired</figcaption></figure>
</div>


<p class="wp-block-paragraph">このように Rust は今後も使用の拡大が十分に期待できる言語です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ビルドツール兼パッケージマネージャ Cargo は高評価（2025年調査）</h4>



<p class="wp-block-paragraph">Rust の開発時においては、ビルドツール兼パッケージマネージャとして Cargo が使用されています。Stack Overflow Developer Survey 2025 の <a href="https://survey.stackoverflow.co/2025/technology#2-cloud-development" target="_blank" rel="noreferrer noopener">Cloud development</a> (クラウド開発環境) では、Cargo の Desired は、13.9% と主要なインフラ系ツールと比較すると高い割合ではありませんが、Admired は 70.8% と非常に高いスコアとなっています。これは、実際に使用している開発者の多くが今後も使いたいと考えていることを示しています。</p>



<p class="wp-block-paragraph">類似するパッケージマネージャーである npm や pip の Admired が 45% 前後であることを考えると Cargo の満足度の高さが際立っています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="1024" height="469" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-40.png" alt="Stack Overflow Developer Survey Cloud development" class="wp-image-1788" srcset="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-40.png 1024w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-40-300x137.png 300w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-40-768x352.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><a href="https://survey.stackoverflow.co/2025/technology#2-cloud-development" target="_blank" rel="noreferrer noopener">Stack Overflow Developer Survey 2025 : Cloud development</a> より引用<br>青：Desired、赤：Admired</figcaption></figure>
</div>


<p class="wp-block-paragraph">このように、Rust は言語自体だけでなく、開発環境 (Cargo を中心としたツールチェーン) も非常に高く評価されていることが分かります。</p>



<p class="wp-block-paragraph">また、Python では、近年 Rust 製のパッケージマネージャーである uv が注目を集めています。uv は依存解決やロックファイル管理など設計思想において Cargo と共通点が多く、Rust のツール設計思想が他言語にも影響を与えつつあることが感じられます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Rust の歴史</h3>



<p class="wp-block-paragraph">Rust は、Web ブラウザの Firefox などで知られる Mozilla のエンジニア Graydon Hoare 氏の個人プロジェクトとして 2006 年に始まり、2009 年から Mozilla が公式プロジェクトとして支援するようになりました。</p>



<p class="wp-block-paragraph">2015 年に Rust 1.0 が正式にリリースされ、以後は安定性と後方互換性を重視した開発が継続されています。2021 年には Rust Foundation が設立され、これを機に Mozilla から独立し、コミュニティによるオープンな体制での開発が進められるようになりました。</p>



<p class="wp-block-paragraph">また、2018 年からは「エディション」という形で言語仕様の大きな節目が導入されており、本記事執筆時点での最新エディションは、Rust 2024 (バージョン1.85.0以降) です。</p>



<p class="wp-block-paragraph">Rust はこのように、Mozilla プロジェクトから始まり、オープンなエコシステムへ成長しました。今では世界中の開発者や企業が支える「高性能」と「安全性」を両立する近代的な言語として注目を集めています。</p>



<div id="nkhn3-2503143394" 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 の特徴と強み</h2>



<p class="wp-block-paragraph">ここでは、Rust が注目・評価されている特徴と強みについて概要を紹介していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">メモリ安全性（所有権、借用、ライフタイム）</h3>



<p class="wp-block-paragraph">Rust が高く評価されている特徴の一つに「メモリ安全性」を言語仕様のレベルで保証している点があげられます。C/C++ などでは、メモリを十分意識した開発が求められますが、メモリの解放忘れ、解放したメモリへのアクセス（ダングリングポインタ）、バッファオーバーフローなどのシステムに大きく影響する深刻なバグが発生しやすいです。</p>



<p class="wp-block-paragraph">Rust では、これらの問題をコンパイル時に防ぐ仕組みが言語仕様として備わっています。代表的な「<strong><span class="jinr-d--text-color d--marker1 d--bold">所有権</span></strong>」「<strong><span class="jinr-d--text-color d--marker1 d--bold">借用</span></strong>」「<strong><span class="jinr-d--text-color d--marker1 d--bold">ライフタイム</span></strong>」といった仕組みについて簡単にご紹介します。</p>



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



<p class="wp-block-paragraph">Rust では、変数がデータの所有者であるという所有権の考え方を持っています。他の変数へ所有権が移動すると、元の変数は該当するメモリ上のデータにはアクセスできなくなります。これによりあるメモリ領域へアクセスできる変数が限定されるため、安全にデータを処理できます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">借用（Borrowing）</h4>



<p class="wp-block-paragraph">データの所有権を移動させずにデータを一時的に参照させることを借用といいます。借用には不変参照（読み取り専用）と可変参照（読み書き可）があります。</p>



<p class="wp-block-paragraph">読み取り専用の不変参照はデータを変更できないため、同時に複数作ることができます。一方で、可変参照は同時に一つしか存在することができず、その間は他の参照や元の変数からのアクセスも禁止されます。これによりデータ競合や不整合のない安全なメモリ管理が実現できます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ライフタイム（Lifetime）</h4>



<p class="wp-block-paragraph">ライフタイムは、借用に関連する概念であり、どれだけの間で参照ができるのか管理します。ライフタイムの考えにより、元の変数が解放されているのに参照がアクセスするような処理をコンパイル時点で見つけることができ、ダングリングポインタによる不正なメモリへのアクセスを排除できます。</p>



<p class="wp-block-paragraph">これらの仕組みは少し理解が難しい内容ですが、理解できるとコンパイラが多くの部分を推論、チェックしてくれるため、自然に安全な実装ができるようなものとなっています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">型安全性</h3>



<p class="wp-block-paragraph">Rust は、型によって安全性と開発者の意図を明確に表現できるようになっています。これはHaskell などの関数型言語の影響を受けた設計とも言われています。代表的な例として「値が存在しない可能性」を明示的に扱う <code>Option&lt;T></code> 型や「成功または失敗」という処理結果を表す <code>Result&lt;T, E></code> 型などがあります。</p>



<p class="wp-block-paragraph">Rust では「値がないかもしれない」「エラーが起こるかもしれない」といったケースに対して、型レベルで明示的に扱う必要があり、開発者はこの状況に正面から向き合うことになります。この強力な型システムにより、開発者の見落としによるバグを未然に防ぐことができます。</p>



<p class="wp-block-paragraph">一方で、こうした明示的な設計はコードの記述量を増やす可能性がありますが、Rust には<strong><span class="jinr-d--text-color d--marker1 d--bold">型推論</span></strong>や<strong><span class="jinr-d--text-color d--marker1 d--bold">パターンマッチング</span></strong>といった仕組みにより、開発者の負担を減らしながら安全性を高めることができるようになっています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ゼロコスト抽象化</h3>



<p class="wp-block-paragraph">Rust には「<strong><span class="jinr-d--text-color d--marker1 d--bold">ゼロコスト抽象化</span></strong>」という概念があります。これは、抽象的で柔軟なプログラムの書き方をしたとしても、コンパイル後には余計な処理が入らずに高速な処理性能が得られるという設計思想です。</p>



<p class="wp-block-paragraph">例えば、特徴的なものとして<strong><span class="jinr-d--text-color d--marker1 d--bold">トレイト (Trait)</span></strong> があります。トレイトは、型に共通する振る舞いを定義するもので、他の言語でいうところのインターフェースに近いようなものです。</p>



<p class="wp-block-paragraph">このような抽象的な実装においては、他の言語で実行時に動的に決定されて処理されることが多く、処理性能に影響します。一方で、Rust ではコンパイル時に静的に決定します。具体的には、コードの記述されているそれぞれの型に対するコードを生成しています。これにより、高性能かつ安全な実装を実現しています。</p>



<h3 class="wp-block-heading jinr-heading d--bold">非同期処理</h3>



<p class="wp-block-paragraph">Rust では、モダンな言語らしく <code>async</code> / <code>await</code> といった構文による非同期処理をサポートしています。</p>



<p class="wp-block-paragraph">また、これまでに紹介したような所有権、強力な型システムといった仕組みにより、非同期であってもメモリ安全性を維持しやすく、スレッドやデータ競合に起因するバグを防ぎやすいという点で非常に優れています。</p>



<p class="wp-block-paragraph">さらに、コンパイル時に処理の安全性が検証されるため、非同期処理にありがちな実行時エラーを未然に防ぎつつ、効率の良い並行処理が可能となっています。</p>



<h2 class="wp-block-heading jinr-heading d--bold">他の言語との違い</h2>



<p class="wp-block-paragraph">Rust は、処理性能で C/C++ に匹敵しながらも安全性が高く、現代的な開発体験を提供してくれる点で、他の多くの言語とは一線を画しています。以下は主要な他の言語との比較です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Rust と他言語の比較表</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>Rust</th><th>C/C++</th><th>Python</th><th>Haskell</th></tr></thead><tbody><tr><td>処理性能</td><td>非常に高い<br>(C++ 並)</td><td>非常に高い</td><td>低め<br>(インタプリタ型)</td><td>高め<br>(最適化は難)</td></tr><tr><td>開発速度</td><td>中程度</td><td>低め</td><td>高い</td><td>低め<br>(抽象度高く難)</td></tr><tr><td>型安全性</td><td>非常に高い<br>(Result 型など)</td><td>低め</td><td>低い<br>(動的型)</td><td>非常に高い<br>(強力な型システム)</td></tr><tr><td>GC の有無</td><td>なし</td><td>なし</td><td>あり</td><td>あり</td></tr><tr><td>学習コスト</td><td>やや高い<br>(所有権など)</td><td>やや高い<br>(ポインタなど)</td><td>低い</td><td>高い<br>(純粋関数型への慣れが必要)</td></tr><tr><td>エコシステム</td><td>成長中<br>(Cargo が強力)</td><td>成熟</td><td>成熟</td><td>専門分野に特化</td></tr><tr><td>抽象化と最適化</td><td>ゼロコスト抽象化で高速</td><td>高度だが安全性に欠ける</td><td>抽象化しやすいが遅くなりやすい</td><td>非常に抽象的・高精度だが難易度高</td></tr><tr><td>非同期処理</td><td>強力<br>(<code>async</code> / <code>await</code>)</td><td>限定的で難易度高</td><td><code>async</code> / <code>await</code>構文を利用可だが性能には限界あり</td><td>強力だが難解</td></tr><tr><td>向いている領域</td><td>システム開発 / Web / CLI / 組込システムなど広範</td><td>OS / ゲーム / 組込システムなど</td><td>Web / データ分析 / 自動化など</td><td>数理処理 / 研究開発など</td></tr></tbody></table></figure>



<h3 class="wp-block-heading jinr-heading d--bold">比較ポイントの要約</h3>



<h4 class="wp-block-heading jinr-heading d--bold">C/C++ との違い</h4>



<p class="wp-block-paragraph">Rust は、C/C++ と同等の性能を持っています。C/C++ では、メモリの手動管理によるバグのリスクが大きいですが、Rust では、コンパイル時にメモリ安全性を言語レベルで保証できるのが大きな違いです。</p>



<h4 class="wp-block-heading jinr-heading d--bold">Python との違い</h4>



<p class="wp-block-paragraph">Python は、非常に書きやすく初心者でも学びやすい言語ですが、実行速度や型安全性に難があります。一方で Rust は、所有権や型に関する理解が必要なため学習コストは高いですが、高速・安全なコードが書けるという違いがあります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">Haskell との違い</h4>



<p class="wp-block-paragraph">Rust は、Haskell のような関数型の良い部分（<code>Option</code> 型、<code>Result</code> 型、パターンマッチングなど）を取り入れつつ、手続き型スタイルにも自然に対応できます。純粋関数型の Haskell ほど抽象度はない分、現実的で実用的なコードを速く書きやすいという違いがあります。</p>



<div id="nkhn3-3241240779" class="nkhn3--2 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 の将来性と課題</h2>



<p class="wp-block-paragraph">Rust は、これまで見てきたように、将来性・安全性・抽象化といった観点で非常にバランスの優れた魅力的な言語です。Rust の将来性と課題についてまとめてみます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Rust の将来性</h3>



<h4 class="wp-block-heading jinr-heading d--bold">大手企業での採用拡大</h4>



<p class="wp-block-paragraph">Google や Microsoft、Amazon などの大手企業での採用も進んでおり、今後も Rust に対応した開発基盤が増えていくと予想されます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">先端的な技術領域での活用</h4>



<p class="wp-block-paragraph">Linux カーネルへの導入や WebAssembly との連携など、先端的な技術領域で活用が広がってきています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">言語仕様・ツールの成熟</h4>



<p class="wp-block-paragraph">コンパイラである rustc やパッケージ管理の Cargo は既に非常に高品質であり、今後も安定的な機能拡張が期待できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Rust の課題</h3>



<h4 class="wp-block-heading jinr-heading d--bold">学習コストの高さ</h4>



<p class="wp-block-paragraph">所有権やライフタイム、型システムなど、Rust 独自の概念は初学者には難しく、習得までに時間がかかる傾向があります。一方で、C/C++、Java、Python、Haskell 等の複数の言語を触ったことがある人にとっては、Rust の設計思想や言語仕様の良さを感じることができ、非常によい学びになると考えます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">人材や情報の不足</h4>



<p class="wp-block-paragraph">利用者が増加傾向ではあるものの、やはり Python や JavaScript などの主流なエンジニアに比べて Rust エンジニアは少数派です。また、情報についても多くは英語であり、日本語のドキュメントも他言語と比べるとまだ少ないです。ただし、着実に増えては来ています。</p>



<p class="wp-block-paragraph">一方で、Rust を学ぶことで貴重な知識・技術を持っている技術者として人材価値を生み出すことができる言語であるともいえます。</p>



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



<p class="wp-block-paragraph"><strong><span class="jinr-d--text-color d--marker1 d--bold">Rust</span></strong> は、C/C++ に匹敵する高いパフォーマンスと Python などのモダンな言語の開発効率を兼ね備えつつ、安全性の高いプログラミングができる現代的なプログラミング言語です。所有権や型安全性といったユニークな仕組みによってバグの少ない堅牢なシステム開発が可能です。</p>



<p class="wp-block-paragraph">また、エコシステムの充実、大手企業での採用、WebAssembly や非同期処理といった先進技術への対応により、Rust は今後ますます活用の幅が広がっていくと考えられます。</p>



<p class="wp-block-paragraph">初学者にとっては学習コストがやや高いですが、習得すれば大きな武器となる言語です。本サイトでは、Rust を学びたい方に向けて、分かりやすく実践的な記事を提供していきます。</p>



<p class="wp-block-paragraph">Rust の魅力をぜひ一緒に体感し、学習に役立てていただければと思います。</p>


<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>


<p class="wp-block-paragraph"></p>
<div id="nkhn3-4159871429" 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-overview-guide/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-06-05 05:32:18 by W3 Total Cache
-->