回答編集履歴
2
追記
test
CHANGED
@@ -9,3 +9,12 @@
|
|
9
9
|
*s.ref_val += 1;
|
10
10
|
}
|
11
11
|
```
|
12
|
+
|
13
|
+
追記
|
14
|
+
----
|
15
|
+
このあたり変性(Variance)に関わってくると思います。
|
16
|
+
うまく説明できるほど理解できていないのでリンクを紹介します。(本質問と同じことが説明されています)
|
17
|
+
https://qiita.com/maueki/items/b5df36e92561450938dd
|
18
|
+
|
19
|
+
`&'a mut T`は`T`に対してinvariant(不変)なので、`&'a mut Foo<'a>` では前側(`&'a ...`)のライフタイムが、後側(`Foo<'a>`) のライフタイムに引っ張られるようなイメージなのかなと思います。
|
20
|
+
リンク先に書かれていますが、アンチパターンなんだと思います。
|
1
追記
test
CHANGED
@@ -2,3 +2,10 @@
|
|
2
2
|
- `S` の中の `ref_val: &mut i32` のライフタイム(つまりは `&mut val` のライフタイム)と
|
3
3
|
- 引数 `&mut s` のライフタイム
|
4
4
|
が同じという宣言なので、本来なら関数が終わったら不要になる `&mut s` の参照が解放されず、次の関数で可変参照が取れずエラーになるのではないでしょうか。
|
5
|
+
|
6
|
+
次のように異なるライフタイムを割り当ててやればエラーは出ないです。
|
7
|
+
```rust
|
8
|
+
fn f<'a, 'b>(s: &'b mut S<'a>) where 'a: 'b {
|
9
|
+
*s.ref_val += 1;
|
10
|
+
}
|
11
|
+
```
|