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