将&T的迭代器收集到T的集合中的惯用方式是什么?

Lou*_*ete 4 iterator reference rust

我需要将遍历&strs 的迭代器收集到&strs 的集合中。问题是迭代器产生&&strs。

我尝试将from映射&wordword,尽管它可以正常工作,但我不知道它是否被认为是好的,或者是否有更好的选择。

问题:

use std::collections::HashSet;

fn main() {
    let words = &["hello", "world", "I'm", "a", "Rustacean!"];
    let hashset = words.iter().collect::<HashSet<&str>>();
}
Run Code Online (Sandbox Code Playgroud)

操场

use std::collections::HashSet;

fn main() {
    let words = &["hello", "world", "I'm", "a", "Rustacean!"];
    let hashset = words.iter().collect::<HashSet<&str>>();
}
Run Code Online (Sandbox Code Playgroud)

我的解决方案:

use std::collections::HashSet;

fn main() {
    let words = &["hello", "world", "I'm", "a", "Rustacean!"];
    let hashset = words.iter().map(|&w| w).collect::<HashSet<&str>>();
}
Run Code Online (Sandbox Code Playgroud)

操场

Pet*_*all 9

如果T执行,Copy则可以使用Iterator::copied。否则,如果实现,Clone则可以使用Iterator::cloned。像任何不可变的引用一样,同时&str实现CloneCopy,因此您可以使用copied

let hashset: HashSet<&str> = words.iter().copied().collect();
Run Code Online (Sandbox Code Playgroud)


She*_*ter 9

自行车是从一个城市到达另一个城市的惯用方式吗?就像软件(和生活)中的大多数事物一样,它取决于

如果您的类型实现 Copy

我希望按以下顺序进行操作:

  1. some_iter.copied()
  2. some_iter.cloned()
  3. some_iter.map(|&v| v)
  4. some_iter.map(|v| *v)
  5. some_iter.map(Clone::clone)
  6. some_iter.map(|v| v.clone())

如果您的类型实现 Clone

我希望按以下顺序进行操作:

  1. some_iter.cloned()
  2. some_iter.map(Clone::clone)
  3. some_iter.map(|v| v.clone())

如果您的类型未实现CopyClone

然后,您将无法轻松创建拥有的价值。该类型可能实现,ToOwned或者可能在内部调用了定制的函数或方法map,或者您可能根本无能为力。


就您而言,我会使用words.iter().copied().collect::<HashSet<_>>()

也可以看看: