2016-11-26 60 views
1

我想創建一個包含函數的特徵,該函數返回一些內部數據的迭代器,然後可以通過不同的結構實現該特性。一個最小的例子如下:有沒有辦法讓Rust推斷相關類型的正確類型?

trait WrapperTrait { 
    type WrapperIterator: Iterator<Item=u32>; 
    fn iter(&self) -> Self::WrapperIterator; 
} 
struct Wrapper { 
    data: Vec<u32> 
} 
impl WrapperTrait for Wrapper { 
    type WrapperIterator = ...; 
    fn iter(&self) -> Self::WrapperIterator { 
     return self.data.iter().map(|&x| x); 
    } 
} 

然而,對於WrapperIterator類型是相當複雜的 - 從一個錯誤消息(經由類型不匹配創建)我發現它是:

std::iter::Map<std::slice::Iter<'_, u32>, [[email protected]:45:37: 45:43]> 

是否有一個讓Rust爲WrapperIterator推斷正確類型的方法?

+0

慣用鏽病將有函數體只是'self.data.iter()地圖(|&X | X)' - 沒有'return',沒有';'。 – Shepmaster

回答

1

有沒有辦法讓Rust爲WrapperIterator導出正確的類型?

號其實,這是直接的什麼鏽則正好相反。你註釋函數參數和返回類型,然後編譯器可以根據推斷的類型。

從方法主體中推斷頂級類型會導致可怕的錯誤消息,這些錯誤消息遠離產生它們的位置。 Haskell很難學會這一點,現在主張所有的頂級函數都有明確的類型簽名。 Rust選擇永遠不要走這條路。另見this answer;雖然它談論生命時間,但許多相同的觀點仍然存在。

你沒有提出的問題(我怎麼返回此迭代器)已經有很多重複:

感謝您問另一個確切的重複。

相關問題