我有一个结构,其中包含HashMap
内的RefCell
。我想在结构上实现一个方法,该方法实际上只是HashMap
的{{1}}方法之上的一层。这是模型的简化版本:
get
无法编译:
use std::cell::RefCell;
use std::cell::Ref;
use std::ops::Deref;
use std::collections::HashMap;
#[derive(Debug)]
struct Bar {
content: String
}
struct Foo {
map: RefCell<HashMap<i32, Bar>>,
}
impl Foo {
pub fn get_val(&self, key: i32) -> Option<&Bar> {
self.map.borrow().get(&key)
}
}
我尝试做类似this similar question的回答:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:21:9
|
21 | self.map.borrow().get(&key)
| ^^^^^^^^^^^^^^^^^ temporary value does not live long enough
22 | }
| - temporary value only lives until here
|
但是它也不起作用:
pub fn get_val(&self, key: i32) -> impl Deref<Target = Option<&Bar>> + '_ {
Ref::map(self.map.borrow(), |mi| &mi.get(&key))
}
是否可以做我想做的事情?还是应该重新考虑对象模型?
在2015年提出了一个identical question,答案是将error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/main.rs:18:46
|
18 | Ref::map(self.map.borrow(), |mi| &mi.get(&key))
| ^^^
|
放在Rc
内。但是,那是在引入HashMap
之前,所以我希望Rust 2018中有更好的解决方案。
Here是游乐场链接。