Заимствование проблем с попыткой кэширования

Следующий фрагмент кода делает то же самое тремя способами.

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, Это даже правильно?

Как я могу достичь своей намеченной цели поиска значения в изменяемом кеше в себе и передать ссылку на другой метод себя?

Ответы на вопрос(2)

Ваш ответ на вопрос