gpt4 book ai didi

rust - 手动删除引用包装器的Rust生命周期问题

转载 作者:行者123 更新时间:2023-12-03 11:39:30 26 4
gpt4 key购买 nike

我正在尝试使用自定义放置逻辑在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`

最佳答案

事实证明,编译器建议添加错误的'b: 'a约束的原因是因为Self中的Self::new隐式引用了'a生存期。解决方案是将Self::new更改为MapRef::new,这允许您删除错误的约束。

impl<'a, K: Eq + Hash, V> MapRef<'a, K, V> {
pub fn reborrow<'b>(&'b mut self) -> MapRef<'b, K, V> {
MapRef::new(self.p)
}
}

请注意,现在可以删除 'b,但是为了清楚起见,我将其保留在此处。

关于rust - 手动删除引用包装器的Rust生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62251227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com