[英]Rust lifetimes for implementing a trait on nested slices
我想圍繞(嵌套的)切片創建一個包裝器,以便對不同結構擁有的多維數據進行輕松操作。 我的切片包裝器的可變版本的最基本版本可能如下所示:
struct MySliceMut<'a> {
data: Vec<&'a mut [f32]>,
}
impl<'a, 'b> MySliceMut<'a> {
fn get(&'b mut self) -> &'a mut [&'b mut [f32]] {
self.data.as_mut_slice()
}
}
現在,如果我想實現一個特征,例如 AddAssign,Rust 似乎不會從實現類型推斷&mut self
的生命周期。 編譯器抱怨&mut self
可能比'a
長:
impl<'a> AddAssign<MySlice<'a>> for MySliceMut<'a> { // lifetime 'a
fn add_assign(&mut self, rhs: MySlice<'a>) { // lifetime '1
let a = self.get(); // lifetime may not live long enough, '1 must outlive 'a
let b = rhs.get();
// do inplace addition here
}
}
我試圖找出生命周期的問題,但找不到。 trait impl 是否需要任何額外的注釋?
struct MySlice<'a> {
data: Vec<&'a [f32]>,
}
impl<'a, 'b> MySlice<'a> {
fn get(&'b self) -> &'a [&'b [f32]] {
self.data.as_slice()
}
}
您的代碼的問題是fn get(&'b self)
返回具有錯誤生命周期的變量。 MySlice<'a>
的關聯生命周期'a
是內部切片的生命周期。 fn get(...)
的關聯生命周期'b
是self
的生命周期。 所以我想 function 可能應該返回&'b [&'a [f32]]
而不是。
-- 編輯--
確保更改MySliceMut
的fn get(...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.