[英]Rust function that takes an iterator, and returns an iterator with mutated items?
我想編寫一個函數,它接受一個迭代器作為輸入,並返回一個具有相同項但是變異的迭代器。 就像在這個例子中:
fn greet(name: &mut String) {
name.insert_str(0, "Hello ");
}
fn to_greetings(names: impl Iterator<Item = String>) -> impl Iterator<Item = String> {
names.inspect(|name| greet(name))
}
這不會編譯,因為name
不可變。 我試過在各個地方添加mut
而不是真正理解我在做什么,但沒有任何成功。 我如何修復上面的代碼?
我想我需要讓這些項可變,但顯然Item = mut String
是一個語法錯誤。
如果迭代器的項類型是String
,則迭代器會產生擁有的字符串。 迭代器將這些字符串的所有權轉移給使用者。 消費者可以修改字符串,因為它擁有它們。
但是,您不能使用inspect()
來修改迭代器的元素。 傳遞給inspect()
的閉包接收對迭代器項的不可變引用,該引用不能用於修改項。 用於修改項目的正確迭代器適配器是map()
,因此這有效(但對我來說並不是特別慣用):
fn to_greetings<I>(names: I) -> impl Iterator<Item = String>
where
I: Iterator<Item = String>,
{
names.map(|mut name| { greet(&mut name); name })
}
如果你想實際修改某個底層容器中的字符串,例如字符串向量,你需要一個不同的方法。 字符串容器上的可變迭代器的項類型為&mut String
,因此您需要使用類似的東西
fn to_greetings<'a, I>(names: I) -> impl Iterator<Item = &'a mut String>
where
I: Iterator<Item = &'a mut String>,
{
names.map(|name| { greet(name); name })
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.