我试图将一个HashSet<String>
转换成一个排序向量,然后可以用逗号将其与join
相加:
use std::collections::HashSet;
fn main() {
let mut hs = HashSet::<String>::new();
hs.insert(String::from("fee"));
hs.insert(String::from("fie"));
hs.insert(String::from("foo"));
hs.insert(String::from("fum"));
let mut v: Vec<&String> = hs.iter().collect();
v.sort();
println!("{}", v.join(", "));
}
这将不会编译:
error[E0599]: no method named `join` found for struct `std::vec::Vec<&std::string::String>` in the current scope
--> src/main.rs:13:22
|
13 | println!("{}", v.join(", "));
| ^^^^ method not found in `std::vec::Vec<&std::string::String>`
我理解为什么不能加入Vec<&String>
,但是我如何将HashSet
转换为Vec<String>
,以便可以加入它呢?
What's an idiomatic way to print an iterator separated by spaces in Rust?中给出的示例似乎不适用,因为Args
的迭代器返回String
值,而HashSet
的迭代器返回&String
。
2条答案
按热度按时间sdnqo3pr1#
我鼓励您重读The Rust Programming Language,特别是the chapter on iterators。接下来,熟悉
Iterator
的方法。我希望看到它实现的正常方式是将
HashSet
转换为迭代器,然后将collect
转换为Vec
:在本例中,我更愿意直接使用
FromIterator
(与collect
相同的特性):专注于更大的问题,使用
BTreeSet
代替,并结合使用What's an idiomatic way to print an iterator separated by spaces in Rust?j5fpnvbx2#
使用turbosfish(
::<>
),有一种直接的方法可以将String
的HashSet
转换为String
的Vec
: