回答編集履歴
1
誤字を修正しました
answer
CHANGED
@@ -3,11 +3,11 @@
|
|
3
3
|
- 例1のクロージャ:`FnOnce`トレイトだけを実装している
|
4
4
|
- 例2のクロージャ:`FnOnce`トレイトと`FnMut`トレイトの両方を実装している
|
5
5
|
|
6
|
-
`FnMut`トレイトを実装するときは、そのクロージャ
|
6
|
+
`FnMut`トレイトを実装するときは、そのクロージャに束縛されている変数(`func`)に`mut`キーワードが必要になります。
|
7
7
|
|
8
8
|
なぜそうなのか、もう少し詳しく説明しましょう。
|
9
9
|
|
10
|
-
クロージャは「無名関数」と「捕捉した環境」からなるデータ構造です。Rustではクロージャを作る構文(
|
10
|
+
クロージャは「無名関数」と「捕捉した環境」からなるデータ構造です。Rustではクロージャを作る構文(`|| {..}`)は糖衣構文になっており、コンパイラはそれに対して以下を自動生成します。
|
11
11
|
|
12
12
|
- 環境を表現するための匿名型(匿名の`struct`)
|
13
13
|
- 環境に対するクロージャトレイトの実装。無名関数はそれらのトレイトが要求するトレイトメソッドとして実装される
|
@@ -27,7 +27,7 @@
|
|
27
27
|
この場合、以下のような匿名型が作られます。
|
28
28
|
|
29
29
|
```rust
|
30
|
-
struct
|
30
|
+
struct FuncEnv1<'a> {
|
31
31
|
count: &'a mut i32,
|
32
32
|
str: String,
|
33
33
|
}
|