I need to collect an iterator over a slice of &str
s into a collection of &str
s. The problem is that the iterator yields &&str
s.
I tried to map from &word
to word
, and while it works, I don't know if it is considered good or if there are better options available.
The problem:
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().collect::<HashSet<&str>>();
}
Playground
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>`
My solution:
use std::collections::HashSet;
fn main() {
let words = &["hello", "world", "I'm", "a", "Rustacean!"];
let hashset = words.iter().map(|&w| w).collect::<HashSet<&str>>();
}
Playground
Is a bicycle an idiomatic way to get from one city to another? Like most things in software (and life), it depends.
Copy
I'd prefer these in this order:
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
I'd prefer these in this order:
some_iter.cloned()
some_iter.map(Clone::clone)
some_iter.map(|v| v.clone())
Copy
or Clone
Then you cannot trivially create an owned value. The type may implement ToOwned
or there may be a bespoke function or method that you can call inside of map
, or you may simply not be able to do anything.
In your case, I'd use words.iter().copied().collect::<HashSet<_>>()
.
See also:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With