我可能会看不到树林而只看到树木,但我想知道如何设计我的方法,使其不针对硬集合类型而是针对迭代器。考虑以下这个方法。
pub fn print_strings(strings: Vec<String>) {
for val in strings.iter() {
println!("{}", val);
}
}
显然,如果我想要将其与
HashSet
或 HashMap
一起使用,这就不够用了。因此,我尝试了以下方法:use std::collections::*;
fn main () {
let strings = vec!("Foo", "Bar");
let mut more_strings = HashMap::new();
more_strings.insert("foo", "bar");
more_strings.insert("bar", "foo");
print_strings(&strings.iter());
print_strings(&more_strings.values())
}
fn print_strings(strings: &Iterator<Item=&str>) {
for val in strings {
println!("{}", val);
}
}
Playpen(也可用于查看冗长的编译器错误)
不幸的是,这似乎也没有起作用。我错过了什么?
Iterator::Item
类型。 - ShepmasterVec<T>
上调用.iter()
时,你会得到一个Iterator<Item=&T>
。因此,当你在Vec<&str>
上调用.iter()
时,你会得到一个Iterator<Item=&&str>
,而不是Iterator<Item=&str>
。你应该查看Iterator
的.cloned()
方法,它应该有助于解决你的问题。 - Adrianprint_strings
而不是通过引用传递。如果您想要使用trait对象来实现这一点,可以使用Box
,但是将print_strings
作为通用函数可能更容易些。 - Adrian