<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=Rust%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3</id>
	<title>Rustの基礎 - クロージャ - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=Rust%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3"/>
	<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=Rust%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3&amp;action=history"/>
	<updated>2026-09-02T14:19:37Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=Rust%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3&amp;diff=13617&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == クロージャとは、環境の変数をキャプチャできる無名関数のことを指す。&lt;br&gt; &lt;br&gt; 通常のメソッドとは異なり、定義されたスコープの変数を参照することができる。&lt;br&gt; Rustのクロージャは、型推論が可能で、引数と戻り値の型を明示的に指定する必要がない場合が多い。&lt;br&gt; &lt;br&gt;&lt;br&gt;  == クロージャの基本 == クロージャを定義する基本的な構文…」</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=Rust%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3&amp;diff=13617&amp;oldid=prev"/>
		<updated>2025-11-29T20:54:29Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == クロージャとは、環境の変数をキャプチャできる無名関数のことを指す。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; 通常のメソッドとは異なり、定義されたスコープの変数を参照することができる。&amp;lt;br&amp;gt; Rustのクロージャは、型推論が可能で、引数と戻り値の型を明示的に指定する必要がない場合が多い。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;  == クロージャの基本 == クロージャを定義する基本的な構文…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
クロージャとは、環境の変数をキャプチャできる無名関数のことを指す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
通常のメソッドとは異なり、定義されたスコープの変数を参照することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
Rustのクロージャは、型推論が可能で、引数と戻り値の型を明示的に指定する必要がない場合が多い。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== クロージャの基本 ==&lt;br /&gt;
クロージャを定義する基本的な構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 let closure_name = |引数| 式;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、2つの引数を受け取り、その合計を返すクロージャを定義している。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let add = |a, b| a + b;&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, add(2, 3));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 5&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
複数行のクロージャを定義する場合は、波括弧&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let add = |a, b| {&lt;br /&gt;
       let result = a + b;&lt;br /&gt;
       result&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, add(2, 3));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 5&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
型を明示的に指定することもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let add = |a: i32, b: i32| -&amp;gt; i32 {&lt;br /&gt;
       a + b&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, add(2, 3));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 5&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 環境のキャプチャ ==&lt;br /&gt;
クロージャは、定義されたスコープの変数をキャプチャすることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
これが通常のメソッドとの主な違いである。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let x = 10;&lt;br /&gt;
    let add_x = |y| x + y;&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, add_x(5));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 15&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
クロージャは、変数を3つの方法でキャプチャできる。&amp;lt;br&amp;gt;&lt;br /&gt;
* 不変参照 (&amp;lt;code&amp;gt;&amp;amp;T&amp;lt;/code&amp;gt;) によるキャプチャ&lt;br /&gt;
* 可変参照 (&amp;lt;code&amp;gt;&amp;amp;mut T&amp;lt;/code&amp;gt;) によるキャプチャ&lt;br /&gt;
* 所有権の移動 (&amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;) によるキャプチャ&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
デフォルトでは、クロージャは必要最小限の方法で変数をキャプチャする。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let mut count = 0;&lt;br /&gt;
 &lt;br /&gt;
    // 可変参照でキャプチャ&lt;br /&gt;
    let mut increment = || {&lt;br /&gt;
       count += 1;&lt;br /&gt;
       println!(&amp;quot;count: {}&amp;quot;, count);&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    increment();&lt;br /&gt;
    increment();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 count: 1&lt;br /&gt;
 count: 2&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== メソッドがクロージャを返す ==&lt;br /&gt;
以下の例では、outer_funcメソッドがクロージャを返している。&amp;lt;br&amp;gt;&lt;br /&gt;
このクロージャは、outer_funcメソッドの引数aとbをキャプチャしている。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn outer_func(a: i32, b: i32) -&amp;gt; impl Fn() -&amp;gt; i32 {&lt;br /&gt;
    move || a + b&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fn main() {&lt;br /&gt;
    let result = outer_func(2, 3);&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, result());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 5&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記の例では、&amp;lt;code&amp;gt;move&amp;lt;/code&amp;gt; キーワードを使用している。&amp;lt;br&amp;gt;&lt;br /&gt;
これは、クロージャが変数の所有権を奪うことを明示的に指定している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;move&amp;lt;/code&amp;gt;を使用しないと、クロージャは参照でキャプチャしようとするが、&amp;lt;br&amp;gt;&lt;br /&gt;
メソッドから返される場合は、ライフタイムの問題が発生するため、&amp;lt;code&amp;gt;move&amp;lt;/code&amp;gt; キーワードが必要となる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
戻り値の型impl Fn() -&amp;gt; i32は、引数を取らずi32を返すクロージャを意味する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== クロージャの実行 ==&lt;br /&gt;
クロージャを実行するには、変数に代入した後、関数と同様に丸括弧 &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt; を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn outer_func(a: i32, b: i32) -&amp;gt; impl Fn() -&amp;gt; i32 {&lt;br /&gt;
    move || a + b&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fn main() {&lt;br /&gt;
    let func = outer_func(2, 3);&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, func());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 5&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、長方形の面積を計算している。&amp;lt;br&amp;gt;&lt;br /&gt;
引数に横(width)を与えるarea_calc メソッドを定義して、縦(height)を引数として面積を計算するクロージャを返している。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn area_calc(width: i32) -&amp;gt; impl Fn(i32) -&amp;gt; i32 {&lt;br /&gt;
    move |height| width * height&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fn main() {&lt;br /&gt;
    // widthが25と50の場合を計算&lt;br /&gt;
    let ac1 = area_calc(25);&lt;br /&gt;
    let ac2 = area_calc(50);&lt;br /&gt;
 &lt;br /&gt;
    // heightを10として面積を求める&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, ac1(10));&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, ac2(10));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 250&lt;br /&gt;
 500&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== クロージャのトレイト ==&lt;br /&gt;
Rustのクロージャは、以下に示す3つのトレイトのいずれかを実装する。&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;FnOnce&amp;lt;/code&amp;gt;&lt;br /&gt;
*: 1度だけ呼び出せるクロージャ。&lt;br /&gt;
*: キャプチャした変数の所有権を消費する可能性がある。&lt;br /&gt;
* &amp;lt;code&amp;gt;FnMut&amp;lt;/code&amp;gt;&lt;br /&gt;
*: 複数回呼び出せるクロージャ。&lt;br /&gt;
*: キャプチャした変数を可変的に借用する。&lt;br /&gt;
* &amp;lt;code&amp;gt;Fn&amp;lt;/code&amp;gt;&lt;br /&gt;
*: 複数回呼び出せるクロージャ。&lt;br /&gt;
*: キャプチャした変数を不変的に借用する。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
全てのクロージャは少なくとも &amp;lt;code&amp;gt;FnOnce&amp;lt;/code&amp;gt; を実装する。&amp;lt;br&amp;gt;&lt;br /&gt;
キャプチャした変数を消費しないクロージャは &amp;lt;code&amp;gt;FnMut&amp;lt;/code&amp;gt; も実装する。&amp;lt;br&amp;gt;&lt;br /&gt;
キャプチャした変数を変更しないクロージャは &amp;lt;code&amp;gt;Fn&amp;lt;/code&amp;gt; も実装する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、それぞれのトレイトを使用したクロージャを示している。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    // Fn : 不変借用&lt;br /&gt;
    let x = 5;&lt;br /&gt;
    let print_x = || println!(&amp;quot;x = {}&amp;quot;, x);&lt;br /&gt;
    print_x();&lt;br /&gt;
    print_x();  // 複数回呼び出せる&lt;br /&gt;
 &lt;br /&gt;
    // FnMut : 可変借用&lt;br /&gt;
    let mut count = 0;&lt;br /&gt;
    let mut increment = || {&lt;br /&gt;
       count += 1;&lt;br /&gt;
       count&lt;br /&gt;
    };&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, increment());&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, increment());  // 複数回呼び出せる&lt;br /&gt;
 &lt;br /&gt;
    // FnOnce: 所有権の移動&lt;br /&gt;
    let s = String::from(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    let consume = || {&lt;br /&gt;
       drop(s);  // sの所有権を消費&lt;br /&gt;
    };&lt;br /&gt;
    consume();&lt;br /&gt;
    // consume();  // エラー: 2回目は呼び出せない&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 x = 5&lt;br /&gt;
 x = 5&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== メソッドの引数としてクロージャを受け取る ==&lt;br /&gt;
メソッドの引数としてクロージャを受け取ることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、ジェネリクスとトレイト境界を使用してクロージャを受け取っている。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn apply&amp;lt;F&amp;gt;(f: F, x: i32, y: i32) -&amp;gt; i32&lt;br /&gt;
 where&lt;br /&gt;
    F: Fn(i32, i32) -&amp;gt; i32,&lt;br /&gt;
 {&lt;br /&gt;
    f(x, y)&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fn main() {&lt;br /&gt;
    let add = |a, b| a + b;&lt;br /&gt;
    let multiply = |a, b| a * b;&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, apply(add, 3, 4));&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, apply(multiply, 3, 4));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 7&lt;br /&gt;
 12&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;impl Trait&amp;lt;/code&amp;gt; 構文を使用して、簡潔に記述することもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn apply(f: impl Fn(i32, i32) -&amp;gt; i32, x: i32, y: i32) -&amp;gt; i32 {&lt;br /&gt;
    f(x, y)&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 fn main() {&lt;br /&gt;
    let add = |a, b| a + b;&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, apply(add, 3, 4));&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 7&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イテレータとクロージャ ==&lt;br /&gt;
Rustでは、イテレータのメソッドでクロージャを頻繁に使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
以下に示すものは、代表的な使用例である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt;メソッドを使用して、各要素を変換する例。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let numbers = vec![1, 2, 3, 4, 5];&lt;br /&gt;
    let doubled: Vec&amp;lt;i32&amp;gt; = numbers.iter().map(|&amp;amp;x| x * 2).collect();&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{:?}&amp;quot;, doubled);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 [2, 4, 6, 8, 10]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、&amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt; メソッドを使用して、条件に合う要素のみを抽出している。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let numbers = vec![1, 2, 3, 4, 5, 6];&lt;br /&gt;
    let evens: Vec&amp;lt;i32&amp;gt; = numbers.iter().filter(|&amp;amp;x| x % 2 == 0).copied().collect();&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{:?}&amp;quot;, evens);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 [2, 4, 6]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、&amp;lt;code&amp;gt;fold&amp;lt;/code&amp;gt; メソッドを使用して、累積計算を行っている。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let numbers = vec![1, 2, 3, 4, 5];&lt;br /&gt;
    let sum = numbers.iter().fold(0, |acc, &amp;amp;x| acc + x);&lt;br /&gt;
 &lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, sum);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 出力&lt;br /&gt;
 15&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== クロージャと所有権 ==&lt;br /&gt;
クロージャは、キャプチャした変数の所有権を扱う方法を柔軟に制御できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
デフォルトでは、クロージャは必要最小限の方法で変数をキャプチャする。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 fn main() {&lt;br /&gt;
    let s = String::from(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    // 不変参照でキャプチャ&lt;br /&gt;
    let print = || println!(&amp;quot;{}&amp;quot;, s);&lt;br /&gt;
    print();&lt;br /&gt;
 &lt;br /&gt;
    // sはまだ使用できる&lt;br /&gt;
    println!(&amp;quot;{}&amp;quot;, s);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;move&amp;lt;/code&amp;gt; キーワードを使用すると、所有権を強制的に移動できる。&amp;lt;br&amp;gt;&lt;br /&gt;
これは、クロージャが元のスコープよりも長く生存する場合に必要となる。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
 use std::thread;&lt;br /&gt;
 &lt;br /&gt;
 fn main() {&lt;br /&gt;
    let s = String::from(&amp;quot;hello&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    // 別スレッドで実行するため、moveが必要&lt;br /&gt;
    let handle = thread::spawn(move || {&lt;br /&gt;
       println!(&amp;quot;{}&amp;quot;, s);&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
    // println!(&amp;quot;{}&amp;quot;, s);  // エラー: sの所有権は移動済み&lt;br /&gt;
 &lt;br /&gt;
    handle.join().unwrap();&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:Rust]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>