回答編集履歴

3

`if self.cache.get(hash).is_none()` を `if !self.contains_key(hash)` に変更しました

2020/05/10 16:04

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  // Metaの存在チェックをして、存在しないならcacheに追加する
18
18
 
19
- if self.cache.get(hash).is_none() {
19
+ if !self.cache.contains_key(hash) {
20
20
 
21
21
  match tasks.get_data(hash)? {
22
22
 

2

ソースコードコメントを追加しました

2020/05/10 16:04

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- なぜこうなるのかというと、`get_ref()`から戻った後、`&Meta`が有効な間は`cache`マップの内容を変更できないようにするためです。もし変更を許すと、`&Meta`が指している`Meta`が`cache`マップから削除できてしまい、&Metaはダングリングポインタになってしまいます。
5
+ なぜこうなるのかというと、`get_ref()`から戻った後、`&Meta`が有効な間は`cache`マップの内容を変更できないようにするためです。もし変更を許すと、`&Meta`が指している`Meta`が`cache`マップから削除できてしまい、`&Meta`はダングリングポインタになってしまいます。
6
6
 
7
7
 
8
8
 
@@ -48,7 +48,9 @@
48
48
 
49
49
 
50
50
 
51
+ // cacheしておいたMetaを返す。これ以降は`&Mata`が有効な間は`self.cache`は
52
+
51
- // cacheしておいたMetaを返す
53
+ // 変更できなくなる
52
54
 
53
55
  self.cache.get(hash).ok_or_else(|| "failed".to_owned())
54
56
 

1

説明を追加しました

2020/05/10 14:23

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -1,4 +1,8 @@
1
1
  エラーメッセージによると、最初のmatchアーム`Some(meta) => Ok(meta)`で`self.cache`が所有する値への参照`&Meta`をmatch式の外に返しているのが原因のようです。`&Meta`が有効な間、つまり、`get_ref()`メソッドの外まで`self.cache`の不変借用が続くことになるので、たとえ`None`のアーム内であっても、その不変借用が有効になっています。
2
+
3
+
4
+
5
+ なぜこうなるのかというと、`get_ref()`から戻った後、`&Meta`が有効な間は`cache`マップの内容を変更できないようにするためです。もし変更を許すと、`&Meta`が指している`Meta`が`cache`マップから削除できてしまい、&Metaはダングリングポインタになってしまいます。
2
6
 
3
7
 
4
8