I want to do
fn main() {
let options: Vec<String> = vec!["a", "b", "c"].map(|s| s.to_owned()).collect();
}
because this seems like the easiest way to get a vector of owned String
s, but I get hit with this error:
error: no method named `map` found for type `std::vec::Vec<&str>` in the current scope
...
note: the method `map` exists but the following trait bounds were not satisfied:
`std::vec::Vec<&str> : std::iter::Iterator`, `[&str] : std::iter::Iterator`
I don't see where the need for the [&str] : std::iter::Iterator
bound comes from. if you ignore the part with split_whitespace
I'm basically doing what answers on this question recommend.
How should I be generating this vector?
if you ignore the part with
split_whitespace
Yes, except you cannot ignore this part. The docs for split_whitespace
state (emphasis mine):
The iterator returned
split_whitespace
returns an iterator over the pieces of the string that were separated by whitespace, and map
is a method on Iterator
.
A Vec
is not an iterator. You can see that Vec
does not implement it's own map
method:
no method named
map
found for typestd::vec::Vec<&str>
And the compiler tries to suggest what you might have meant, but weren't quite achieving:
note: the method
map
exists but the following trait bounds were not satisfied:
You can get an iterator from a Vec
by calling Vec::iter
or into_iter
:
fn main() {
let options: Vec<String> = vec!["a", "b", "c"].into_iter().map(|s| s.to_owned()).collect();
}
However, there's no need to allocate two vectors here, an array and a vector is more efficient:
let options: Vec<_> = ["a", "b", "c"].iter().map(|s| s.to_string()).collect();
An iterator over a slice returns references (&T
) to the elements in the slice. Since each element is already a &str
, the type of s
is a &&str
. Calling to_owned
on a reference to a reference simply clones the reference. You could also have said .map(|&s| s.to_owned())
, which dereferences the value once, producing a &str
. Calling to_owned
on a &str
allocates a String
.
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