2016-05-23 20 views
1
fn main() { 
    let a = ["1", "2", "lol"]; 
    let cnt = a.iter().filter_map(|s| s.parse().ok()).count(); 
} 

錯誤消息如何爲Iterator :: filter_map指定類型信息?

<anon>:3:24: 3:34 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282] 

<anon>:3  let cnt = a.iter().filter_map(|s| s.parse().ok()).count(); 
           ^~~~~~~~~~ 

我試圖爲filter_map()指定類型,但沒有成功。如果可能的話,我也想知道爲什麼如果我刪除了count()方法,編譯器不會抱怨。

+0

刪除'.count()'有同樣的錯誤,[據我所見](https://play.rust-lang.org/?gist=5a204c4e748c6cb5138533947591e0cd&version=穩定的回溯= 0)。 – Shepmaster

回答

4

編譯器不知道解析的結果類型,因爲您編寫代碼的方式可以適用於任何類型。您需要特別註釋此方法調用:s.parse::<i32>().ok()

+0

它可以在其他地方完成嗎?比如'filter_map :: ()'我不確定什麼是「?」部分應該是。 –

+1

您可以執行'filter_map :: (...)',編譯器會推斷閉包類型。不過,您不能明確指定閉包的具體類型。 –

+4

但是,我會聲稱顯式指定'parse'的參數更具慣用性和可讀性,因爲這真是出現歧義的地方。 –