[英]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 說有一個匿名生命周期定義與 index(...) 定義中的 'a 沖突:“錯誤[E0495]:由於沖突要求,無法推斷函數調用中生命周期參數的適當生命周期”。
我應該如何實現這一點? 還是我對一生的假設完全錯誤? 謝謝。
您不需要指定返回引用的生命周期(注意-> &u8
)。 游樂場。
錯誤是因為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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.