用生命周期实现索引特征

我想重载此结构的索引运算符:

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 在 index(...) 定义中冲突:“错误[E0495]:由于需求冲突,无法推断函数调用中生命周期参数的适当生命周期”。

我应该如何实现这一点?还是我对一生的假设完全错误?谢谢。

回答

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

错误是因为Index性状需要对象的寿命说明符(&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
}


以上是用生命周期实现索引特征的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>