簡體   English   中英

實現索引特征以返回一個不是引用的值

[英]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的界面證實了這一直覺。

我可以看到您可能試圖實現的兩件事:

  1. 為您的數據結構獲取良好的索引語法。

在這種情況下,我建議反對實現Index的前提,只提供一種返回f64而不是&f64

impl MyStruct {
    pub fn index(&self, idx: usize) -> f64 {
        self.start + (idx as f64) * self.step
    }
}

你沒有得到操作符,這很好,因為有人閱讀[]會被誤導,認為他們得到了一個指針。 但是你確實得到了你想要的功能。 根據您的用例,您可能希望重命名此方法。

  1. MyStruct傳遞給具有Index邊界的參數。

這是有充分理由的棘手。 Index期望數據在它要求之前就在那里。 您無法生成並返回它,因為index返回f64 ,並且您無法在數據結構中生成它並返回一個指針,因為它不接受&mut self 您必須在調用index之前填充這些值。 一些重新設計將是有序的,重新設計的方向將取決於您的問題的更大背景。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM