Emprestando problemas com a tentativa de armazenamento em cache

O seguinte trecho de código faz as mesmas coisas de três maneiras.

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 não compila, fornecendo o seguinte erro:

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

Tanto quanto eu digo, o problema comshow3 não se trata de mutabilidade, mas de um empréstimo duplo: o empréstimo deself é dado aget_cached o que não acaba porqueget_cached retorna uma referência a algo contido emself. Isso está correto?

Como posso atingir meu objetivo de procurar um valor em um cache mutável e passar a referência a outro método de auto?

questionAnswers(2)

yourAnswerToTheQuestion