以下代码段以3种方式执行相同的操作.
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() {}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
据我所知,问题show3不在于可变性,而在于双重借用:借用的东西self是get_cached不会结束的,因为它会get_cached返回对包含内容的引用self.这甚至是正确的吗?
如何实现我在自我中查找可变缓存中的值并将引用传递给另一个自我方法的预期目标?
您可以尝试&mut添加self如show_impl
...
fn show_impl(&self, what: &String)
...
Run Code Online (Sandbox Code Playgroud)
所以不会混在一起。