回答編集履歴

2

追記

2025/04/01 23:39

投稿

bsdfan
bsdfan

スコア4899

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

追記

2025/04/01 08:18

投稿

bsdfan
bsdfan

スコア4899

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