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?