[英]Implementing Index trait to return a value that is not a reference
我有一個簡單的結構,我想為其實現Index
,但是作為 Rust 的新手,我在借用檢查器方面遇到了許多麻煩。 我的結構非常簡單,我想讓它存儲一個開始和步長值,然后當由usize
索引時它應該返回start + idx * step
:
pub struct MyStruct {
pub start: f64,
pub step: f64,
}
我的直覺是,我可以簡單地獲取Index
的簽名並插入我的類型:
impl Index<usize> for MyStruct {
type Output = f64;
fn index(&self, idx: usize) -> &f64 {
self.start + (idx as f64) * self.step
}
}
這給出了錯誤mismatched types
表示expected type &f64, found type f64
。 作為尚未完全理解 Rust 的類型系統如何工作的人,我嘗試簡單地在表達式上加上&
:
fn index(&self, idx: usize) -> &f64 {
&(self.start + (idx as f64) * self.step)
}
這現在告訴我, borrowed value does not live long enough
,所以也許它需要一個生命周期變量?
fn index<'a>(&self, idx: usize) -> &'a f64 {
&(self.start + (idx as f64) * self.step)
}
錯誤是一樣的,但注釋現在給出了lifetime 'a
而不是lifetime #1
,所以我想這沒有必要,但在這一點上我覺得我被卡住了。 我很困惑,對於大多數語言來說,這樣一個簡單的練習在 Rust 中變得如此難以實現,因為我想要做的就是從恰好位於引用后面的函數返回一個計算。 我應該如何為按需計算值的簡單結構實施Index
?
Index
trait 旨在返回一個借用的指向self
成員的指針(例如Vec
一個項目)。 來自Index
trait 的index
方法的簽名使得實現它以具有您描述的行為是不切實際的,因為您必須將index
返回的每個值存儲在self
並確保指針在MyStruct
被刪除之前保持有效。
此用例與Index
的直覺不匹配。 當我看到myStruct[3]
,我的直覺是,就像數組一樣,我得到了一個指向一些已初始化數據的指針。 Index
的界面證實了這一直覺。
我可以看到您可能試圖實現的兩件事:
在這種情況下,我建議反對實現Index
的前提,只提供一種返回f64
而不是&f64
。
impl MyStruct {
pub fn index(&self, idx: usize) -> f64 {
self.start + (idx as f64) * self.step
}
}
你沒有得到操作符,這很好,因為有人閱讀[]
會被誤導,認為他們得到了一個指針。 但是你確實得到了你想要的功能。 根據您的用例,您可能希望重命名此方法。
MyStruct
傳遞給具有Index
邊界的參數。 這是有充分理由的棘手。 Index
期望數據在它要求之前就在那里。 您無法生成並返回它,因為index
返回f64
,並且您無法在數據結構中生成它並返回一個指針,因為它不接受&mut self
。 您必須在調用index
之前填充這些值。 一些重新設計將是有序的,重新設計的方向將取決於您的問題的更大背景。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.