用生命周期实现索引特征
我想重载此结构的索引运算符:
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
}