【问题标题】:Rust function that takes an iterator, and returns an iterator with mutated items?Rust 函数接受一个迭代器,并返回一个带有变异项的迭代器?
【发布时间】:2019-01-25 20:47:55
【问题描述】:

我想编写一个函数,该函数将一个迭代器作为输入,并返回一个具有相同项但已变异的迭代器。就像在这个例子中一样:

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 是一个语法错误。

【问题讨论】:

  • 我不太清楚你想如何使用这个迭代器。可以举个例子吗?

标签: rust iterator mutable


【解决方案1】:

如果迭代器的项目类型是String,则迭代器产生owned 字符串。迭代器将这些字符串的所有权转移给消费者。消费者可以修改字符串,因为它拥有它们。

但是,您不能使用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 })
}

如果您想实际修改某个底层容器中的字符串,例如一个字符串向量,你需要一种不同的方法。字符串容器上的可变迭代器的项目类型为&amp;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 })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2016-04-30
    • 2010-09-23
    • 2017-03-10
    • 2011-06-30
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多