Probleme beim Ausleihen beim versuchten Caching

Das folgende Code-Snippet macht das Gleiche auf drei Arten.

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 wird nicht kompiliert und gibt den folgenden Fehler aus:

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

Soweit ich weiß, ist das Problem mitshow3 geht es nicht um Veränderbarkeit, sondern um eine doppelte Ausleihe: die Ausleihe vonself wird verschenkt anget_cached was nicht endet, weilget_cached gibt einen Verweis auf etwas zurück, das in enthalten istself. Ist das überhaupt richtig?

Wie kann ich mein beabsichtigtes Ziel erreichen, einen Wert in einem veränderlichen Cache in self nachzuschlagen und den Verweis auf eine andere Methode von self weiterzugeben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage