如何在Rust中将Iterator <String>作为Iterator <&str>传递?

ami*_*min 1 rust

fn my_print<'a>(args: impl Iterator<Item=&'a str>) {
    for arg in args {
        println!("=> {}", arg);
    }
}

fn main() {
    let vec = vec!["one".to_string(), "two".to_string()];
    my_print(vec.into_iter()); // how to pass vec here?
}
Run Code Online (Sandbox Code Playgroud)

如何转换Iterator<T>Iterator<U>并将其传递给另一个函数?

mca*_*ton 6

更好的方法是以实际上并不关心的方式编写函数:

fn my_print<T: AsRef<str>>(args: impl Iterator<Item = T>) {
    for arg in args {
        println!("=> {}", arg.as_ref());
    }
}

fn main() {
    let vec = vec!["one".to_string(), "two".to_string()];
    my_print(vec.into_iter()); // works!
}
Run Code Online (Sandbox Code Playgroud)

如果您不能更改函数签名,则必须事先转换迭代器

fn my_print<'a>(args: impl Iterator<Item = &'a str>) {
    for arg in args {
        println!("=> {}", arg);
    }
}

fn main() {
    let vec = vec!["one".to_string(), "two".to_string()];
    my_print(vec.iter().map(|s| s.as_ref()));
}
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您将无法使用,into_iter因为没人会拥有这些字符串。