簡體   English   中英

如果 map 不是迭代器,如何引用<item=&t> ?</item=&t>

[英]How to map to references if it's not an Iterator<Item=&T>?

我有一個接收 Iterator<Item=AsRef> 的 function,我想從這個迭代器中獲取一個子字符串數組。 問題是在映射時, .map()獲得了 AsRef 的所有權,而我無法返回as_ref() 我怎樣才能把這個迭代器變成像 Vec::iter 這樣的引用迭代器? 示例代碼:

fn a(lines: impl Iterator<Item=impl AsRef<str>>) {
    println!("{:?}", lines.map(|s| s.as_ref()).collect::<Vec<&str>>());
}

a(vec!["one".to_string(), "two".to_string()].iter());

僅使用迭代器有點問題。 正如簽名所描述的,迭代器可以非常匹配擁有Item (s) 並將所有權轉移給閉包內的您。 考慮&impl AsRef<str> 在調用方站點提供這應該不是問題。

編輯

實際上,調用方也很棘手。 我正在使用返回 Iterator<Item=String> 的 ReadBuf。 如何將此迭代器變成 Iterator<Item=&String>?

BufRead 將根據您的需要讀取行,它被設計為等待輸入。 為了正確使用它並以 memory 的效率,我建議循環處理每一行並在閱讀下一行之前丟棄它。

這是我找到的解決方案,但似乎必須分配整個 Vec 才能獲得迭代器中我已經擁有的項目的引用,這似乎非常昂貴。

Iterator 實際上並不同時擁有所有的字符串。 相反,它會分批讀取它們(或者它應該)並且它不會在內部存儲它們供您引用它們(或者至少它不應該)。

暫無
暫無

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

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