我想重载这个结构的索引操作符:
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]
}
}这不能编译。铁锈说,有一个匿名的生命周期定义与'a at the index(.)定义相冲突:"errorE0495:由于需求冲突,无法推断函数调用中的生存期参数的适当生存期“。
我该如何实现这一点?还是我对生命周期的假设完全错了?谢谢。
发布于 2021-07-13 08:01:58
您不需要指定返回引用的生存期(注意-> &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
}https://stackoverflow.com/questions/68358481
复制相似问题