簡體   English   中英

帶有迭代器的Rust函數,並返回帶有變異項的迭代器?

[英]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.

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