我正在使用 Advent of Code 學習 Rust。
要決議 2021 年 04 日,我需要決議以下字串:
88 67 20 19 15
22 76 86 44 73
7 42 6 69 25
12 68 92 21 75
97 45 13 52 70
75 98 24 18 77
17 93 46 49 13
92 56 97 57 66
44 0 65 54 74
23 6 53 42 20
92 94 9 27 41
73 28 62 90 40
78 3 12 37 32
8 86 91 16 30
84 38 68 11 19
理想情況下,我想生成嵌套向量Vec<Vec<&str>>。
我的問題是我不明白為什么下面的代碼不起作用。
let bingo_sheet = grids_str
split("\r\n\r\n")
.map(|grid| grid.split_whitespace())
.collect::<Vec<Vec<&str>>>();
我也不明白貨物檢查背后的含義。(好吧,特征不存在。但為什么呢?)
error[E0277]: a value of type `Vec<Vec<&str>>` cannot be built from an iterator over elements of type `SplitWhitespace<'_>`
--> src\main.rs:36:10
|
36 | .collect::<Vec<Vec<&str>>>();
| ^^^^^^^ value of type `Vec<Vec<&str>>` cannot be built from `std::iter::Iterator<Item=SplitWhitespace<'_>>`
|
= help: the trait `FromIterator<SplitWhitespace<'_>>` is not implemented for `Vec<Vec<&str>>`
經過一些實驗,這種用法flat_map似乎有效。
let bingo_sheet = grids_str
.split("\r\n\r\n")
.flat_map(|grid| grid.split_whitespace())
.collect::<Vec<&str>>();
我不明白這里發生了什么。
該flat_map代碼的行為與預期,而不是map代碼。
uj5u.com熱心網友回復:
在我寫這篇文章時,已經在評論中簡要回答了這個問題,但也許更詳細的版本仍然有幫助!
我也不明白貨物檢查背后的含義。(好吧,特征不存在。但為什么呢?)
std 提供了經常使用的轉換,但它并沒有為您完成所有這些轉換。
呼叫split_whitespace回傳一個SplitWhitespace實作的結構(在此的其余部分我將簡單地說“是”)Iterator。呼叫map回傳一個Map結構體,它是在給定函式的回傳型別上的迭代器,所以它是在字串切片上的迭代器上的迭代器。
因為Map是一個迭代器,所以它有一個collect方法。正如您在檔案中看到的那樣,如果有一個B實作FromIterator<Self::Item>. 這B是你的Vec<Vec<&str>>和Self::Item是該專案Map的SplitWhiteSpace結構。所以collect問,“是否Vec<Vec<&str>>實施FromIterator<SplitWhiteSpace>?,如果是,我存在,如果不是,我拒絕存在”。
(FromIterator<SplitWhiteSpace>并不意味著Vec<T>可以由SplitWhiteSpace結構構成,而是可以由某種型別I構成(或可以構成)專案上的迭代器SplitWhiteSpace。)
因此,讓我們查看 Vec 檔案并找出是否Vec<Vec<&str>>實作了FromIterator<SplitWhiteSpace>。Vec確實實施FromIterator<T>但僅適用于Vec<T>,因此在您的情況下,它實施了FromIterator<Vec<&str>>但 collect 要求它實施FromIterator<SplitWhiteSpace>。不是這樣,您的代碼無法編譯。
換句話說,當Map<X>將 a收集到 a 中時Vec<Y>,X 必須等于 Y。
這就是為什么collect()在.map作品中添加 a 的原因。因為這使它成為 aMap<Vec<&str>>這意味著型別匹配。flatmap也適用,因為創建FlatMap<&str>它的作業方式類似于Map,可以收集到Vec<&str>。(flat_map不需要collect內部給定的函式,因為它可以處理內部的迭代器)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378401.html
上一篇:div類的條件文本更改
