簡體   English   中英

用生命周期實現索引特征

[英]Implementing Index trait with lifetime

我想重載此結構的索引運算符:

struct Ram<'a> {
    ram: &'a mut [u8]
}

impl<'a> Ram<'a> {
  pub fn new( bytes: &mut[u8]) -> Ram {
    Ram {
        ram: bytes
    }
  }
}

...基本上是字節數組上的“控制器”。 我這樣做是因為我想將它重用於不同大小的字節數組。 我知道生命周期在這里是為了確保“ram”引用在整個執行過程中都是有效的。 這是我當前的索引代碼:

use std::ops::{Index};
impl<'a> Index<usize> for Ram<'a> {
    type Output = u8;
    fn index(&self, i: usize) -> &'a u8 {
        &self.ram[i]
    }
}

這不編譯。 Rust 說有一個匿名生命周期定義與 index(...) 定義中的 'a 沖突:“錯誤[E0495]:由於沖突要求,無法推斷函數調用中生命周期參數的適當生命周期”。

我應該如何實現這一點? 還是我對一生的假設完全錯誤? 謝謝。

您不需要指定返回引用的生命周期(注意-> &u8 )。 游樂場

錯誤是因為Index trait 要求對象的生命周期說明符 ( &self ) 和返回值 ( &u8 ) 相同(這相當於要求&self至少與返回的引用一樣長)。

為了簡化編碼,Rust 允許跳過此生命周期的顯式規范,因此留下&self&u8與指定&'x self&'x u8 您只明確指定了引用的生命周期之一,從而混淆了編譯器。

use std::ops::{Index};
impl<'a> Index<usize> for Ram<'a> {
    type Output = u8;
    fn index(&self, i: usize) -> &u8 {
        &self.ram[i]
    }
}

fn main() {
    let mut _ram = [0, 1, 2, 3]; 
    let ram_holder = Ram::new(&mut _ram);
    println!("{}", ram_holder[1]);
    // prints: 1
}

暫無
暫無

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

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