回答編集履歴
3
`if self.cache.get(hash).is_none()` を `if !self.contains_key(hash)` に変更しました
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
// Metaの存在チェックをして、存在しないならcacheに追加する
|
18
18
|
|
19
|
-
if self.cache.
|
19
|
+
if !self.cache.contains_key(hash) {
|
20
20
|
|
21
21
|
match tasks.get_data(hash)? {
|
22
22
|
|
2
ソースコードコメントを追加しました
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
|
-
//
|
53
|
+
// 変更できなくなる
|
52
54
|
|
53
55
|
self.cache.get(hash).ok_or_else(|| "failed".to_owned())
|
54
56
|
|
1
説明を追加しました
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
|
|