回答編集履歴
3
誤字を修正しました
answer
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
|
31
31
|
> 確かに `z : &S` 経由で `s.y : &mut i32` にアクセスできてしまうと、 `s` の immutable な参照ならいくつでも作れてしまうので、 `S::y` という `&mut` な参照が複数作成できることになります。
|
32
32
|
|
33
|
-
たとえば `S` に `fn f(&self)` というメソッドを実装したとき、`
|
33
|
+
たとえば `S` に `fn f(&self)` というメソッドを実装したとき、`self.y` が変更できてしまうと問題があります。
|
34
34
|
|
35
35
|
> 1. どこを見て `z.y` を immutable reference としているのか `S::y` の型だけ見れば `&mut i32` なのに。
|
36
36
|
|
2
わかりやすさのために最初の段落を修正しました
answer
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
> もし `S::y : &mut i32` が、 `a : S` または `a : &mut S` のときのみ `S::y : &mut i32` で、 `a : &S` のときは `S::y : &i32` となると見做される
|
2
2
|
|
3
|
-
私もそうだと思います。
|
3
|
+
私もそうだと思います。struct 全体またはフィールドを借用する際、フィールドが mutable になるかは、struct のフィールド定義(`y: &mut i32`)ではなく、struct 自体の mutability で決まるようです。
|
4
4
|
|
5
|
-
たとえば以下のように `y` フィールド
|
5
|
+
たとえば以下のように `s` が immutable の時に `y` フィールドの mutable な参照を作ろうとしてもコンパイルできません。
|
6
6
|
|
7
7
|
```rust
|
8
8
|
fn baz2() {
|
1
わかりやすさのためにコードコメントを追加
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
let mut x = 1;
|
10
10
|
let mut v = 5;
|
11
11
|
let s = S { y: &mut x };
|
12
|
-
let z_y = &mut s.y;
|
12
|
+
let z_y = &mut s.y; // y フィールドだけ mut 借用
|
13
13
|
*z_y = &mut v;
|
14
14
|
}
|
15
15
|
```
|