使用生命周期实现索引特征

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 表示有一个匿名生命周期定义与 'a at the index(...) 定义冲突:“错误 [E0495]:由于需求冲突,无法为函数调用中的生命周期参数推断出合适的生命周期”。

我该如何实现?还是我对生命周期的假设完全错误?谢谢

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

错误是因为 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
}