Заимствование проблем с попыткой кэширования
Следующий фрагмент кода делает то же самое тремя способами.
use std::collections::HashMap;
struct Foo {
cache: HashMap<String, String>,
}
impl Foo {
fn get_cached(&mut self, key: &String) -> &String {
if !self.cache.contains_key(key) {
self.cache.insert(key.clone(), String::from("default"));
}
self.cache.get(key).unwrap()
}
fn show_impl(&self, what: &String) {
println!("{}", what);
}
pub fn show1(&mut self, key: &String) {
println!("{}", self.get_cached(key));
}
pub fn show2(&mut self, key: &String) {
if !self.cache.contains_key(key) {
self.cache.insert(key.clone(), String::from("default"));
}
self.show_impl(self.cache.get(key).unwrap());
}
// This does not compile
pub fn show3(&mut self, key: &String) {
self.show_impl(self.get_cached(key));
}
}
fn main() {}
show3
не компилируется, выдавая следующую ошибку:
error[E0502]: cannot borrow `*self` as mutable because it is also borrowed as immutable
--> src/main.rs:28:24
|
28 | self.show_impl(self.get_cached(key));
| ---- ^^^^ - immutable borrow ends here
| | |
| | mutable borrow occurs here
| immutable borrow occurs here
Насколько я говорю, проблема сshow3
речь идет не об изменчивости, а о двойном заимствовании: заемself
отданget_cached
который не заканчивается, потому чтоget_cached
возвращает ссылку на то, что содержится вself
, Это даже правильно?
Как я могу достичь своей намеченной цели поиска значения в изменяемом кеше в себе и передать ссылку на другой метод себя?