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?