非破坏性地迭代Rust集合,但不是通过引用

Cam*_*rzt 2 iterator move-semantics rust

我可以用以下两种方式编写,第二种方法的灵感来自于创建一个引用自我的方法的参考集合的惯用方法是什么?:

channels.iter().flat_map(|c|c.to_uppercase()).collect(),
channels.clone().into_iter().flat_map(char::to_uppercase).collect(),
Run Code Online (Sandbox Code Playgroud)

第二行必须克隆集合,因为char::to_uppercase它不接受引用作为它的参数,并.iter()提供引用并.into_iter()移动集合.

有没有办法做到这一点,不需要克隆集合或创建一个闭包?我并不讨厌闭包,我保证,我知道它们只是在LLVM中转换成(通常是内联的)函数调用,但是我喜欢在第二行中引用函数的干净,并且更喜欢使用它如果可以在没有克隆的情况下完成.

oli*_*obk 5

Iterator有一种cloned方法,相当于.map(|x| x.clone()),在Copy类型的情况下相当于.map(|&x| x).这样你就可以写了

channels.iter().cloned().flat_map(char::to_uppercase).collect()
Run Code Online (Sandbox Code Playgroud)