簡體   English   中英

從具有生命周期的結構方法中返回引用

[英]Returning References from Struct Method with Lifetimes

我正在嘗試這個代碼:

struct ByteIter<'a> {
    remainder: &'a mut [u8],
    index: usize,
}

impl<'a> ByteIter<'a> {
    fn new(remainder: &'a mut [u8]) -> ByteIter<'a> {
        ByteIter{remainder, index: 0}
    }

    fn next(&'a mut self) -> Option<&'a mut u8> {
        if self.index >= self.remainder.len() {
            None
        } else {
            let mut byte = &mut self.remainder[self.index];
            self.index  += 1;
            Some(byte)
        }
    }
}

fn main() {
    let mut a = [ 0x51, 0x52, 0x53, 0x54];
    let mut bytes = ByteIter::new(&mut a);
    {
        let byte_1 = bytes.next();
    }
    let byte_2 = bytes.next();

}

現在,據我所知, byte_1是從字節借來的。 但是它的壽命已經過了。 仍然當我編譯這個時,我看到以下錯誤:

29 |     let byte_2 = bytes.next();
   |                  ^^^^^
   |                  |
   |                  second mutable borrow occurs here
   |                  first borrow later used here

這里的第一個可變借用是什么? 當 byte_1 超出范圍時不應該釋放它嗎?

重要的是,我應該怎么做才能解決這個問題?

使用impl<'a> ByteIter<'a> ,您可以聲明'a是結構中使用的生命周期,即它是底層切片的生命周期。

現在,當您說fn next(&'a mut self) -> Option<&'a mut u8> { ,您正在重用相同的'a ,並且您說它與返回的可變引用相同。 您是說返回的生命周期與ByteIter結構內容相同。

刪除額外的生命周期約束,編譯器將可以自由計算適當的生命周期:

fn next(& mut self) -> Option<& mut u8> {
    if self.index >= self.remainder.len() {
        None
    } else {
        let mut byte = &mut self.remainder[self.index];
        self.index  += 1;
        Some(byte)
    }
}

暫無
暫無

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

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