我正在尝试使用自定义放置逻辑在Rust中编写一个包装可变引用的类,但是无论我做什么,我都无法确定生存期,并且编译器错误消息也无济于事。谁能告诉我我在做什么错,以及如何解决?
[注意:我已经尝试过对此代码进行所有修改,例如删除或反转'b: 'a
约束,但是无论我做什么,编译器都会产生一种难以理解的寿命错误消息或另一种。 >
pub struct MapRef<'a, K: Eq + Hash, V>{ p: &'a mut HashMap<K, V>, } impl<'a, K: Eq + Hash, V> MapRef<'a, K, V> { pub fn new(p: &'a mut HashMap<K, V>) -> Self {Self{p}} } impl<'a, K: Eq + Hash, V> MapRef<'a, K, V> { pub fn reborrow<'b: 'a>(&'b mut self) -> MapRef<'b, K, V> { Self::new(self.p) } } impl<'a, K: Eq + Hash, V> Drop for MapRef<'a, K, V> { fn drop(&mut self) { println!("dropping ref"); } } #[cfg(test)] mod tests { use super::*; #[test] fn test() -> Result<(), String> { let mut m: HashMap<(), ()> = HashMap::new(); let mut r1 = MapRef::new(&mut m); { let r2 = r1.reborrow(); } Ok(()) } }
示例错误消息:
|
37 | let r2 = r1.reborrow();
| ^^ borrowed value does not live long enough
...
41 | }
| -
| |
| `r1` dropped here while still borrowed
| borrow might be used here, when `r1` is dropped and runs the `Drop` code for type `util::MapRef`
我正在尝试用自定义放置逻辑在Rust中编写一个包装可变引用的类,但是无论我做什么,我都无法确定生存期,并且编译器错误消息也没有.. 。
事实证明,编译器建议添加错误的'b: 'a
约束的原因是,Self
中的Self::new
隐含地引用了'a
生存期。解决方案是将Self::new
更改为MapRef::new
,这可以让您删除不良约束。