簡體   English   中英

Rust 生命周期問題與手動刪除的引用包裝器

[英]Rust lifetime issue with manually dropped reference wrapper

我正在嘗試使用包含可變引用的自定義刪除邏輯在 Rust 中編寫 class ,但無論我做什么,我都無法解決生命周期,並且編譯器錯誤消息也沒有幫助。 誰能告訴我做錯了什么,以及如何解決?

注意:我已經嘗試了我能想到的對此代碼的所有修改,例如刪除或反轉'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中的 Self 隱含地引用了'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 ,但為了清楚起見,我將其保留在此處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM