我需要收集一个迭代器&str
s 进入一个集合&str
s。问题是迭代器产生&&str
s.
我尝试从映射&word
to word
,虽然它有效,但我不知道它是否被认为是好的,或者是否有更好的选择。
问题:
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().collect::<HashSet<&str>>();
}
error[E0277]: a collection of type `std::collections::HashSet<&str>` cannot be built from an iterator over elements of type `&&str`
--> src/main.rs:5:32
|
5 | let hashset = words.iter().collect::<HashSet<&str>>();
| ^^^^^^^ a collection of type `std::collections::HashSet<&str>` cannot be built from `std::iter::Iterator<Item=&&str>`
|
= help: the trait `std::iter::FromIterator<&&str>` is not implemented for `std::collections::HashSet<&str>`
我的解决方案:
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().map(|&w| w).collect::<HashSet<&str>>();
}
骑自行车是从一个城市到另一个城市的惯用方式吗?就像软件(和生活)中的大多数事物一样,它depends.
如果你的类型实现了Copy
我更喜欢按以下顺序排列:
some_iter.copied()
some_iter.cloned()
some_iter.map(|&v| v)
some_iter.map(|v| *v)
some_iter.map(Clone::clone)
some_iter.map(|v| v.clone())
如果你的类型实现了Clone
我更喜欢按以下顺序排列:
some_iter.cloned()
some_iter.map(Clone::clone)
some_iter.map(|v| v.clone())
如果你的类型没有实现Copy
or Clone
那么你就无法轻易地创造出拥有的价值。该类型可以实现ToOwned https://doc.rust-lang.org/std/borrow/trait.ToOwned.html或者可能有一个您可以在其中调用的定制函数或方法map
,或者您可能根本无法做任何事情。
在你的情况下,我会使用words.iter().copied().collect::<HashSet<_>>()
.
也可以看看:
- 在 Rust 中迭代切片的值而不是引用? https://stackoverflow.com/q/40613725/155423
- 按值从原始类型引用复制的惯用方法是什么? https://stackoverflow.com/q/25684227/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)