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

时间:2019-05-02 08:23:10

标签: 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?
}

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

2 个答案:

答案 0 :(得分:6)

更好的方法是在a way such as it doesn't actually care中编写函数:

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!
}

如果无法更改功能签名,请you have to convert the iterator beforehand

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()));
}

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

答案 1 :(得分:1)

  

如何将 Style style = new Style(typeof(Label)); style.Setters.Add(new Setter(Label.ForegroundProperty, Brushes.Blue)); Resources[typeof(Label)] = gridStyle; 转换为Iterator<T>并将其传递给另一个函数?

您使用Iterator<U>的{​​{1}}适配器功能。


在您的特定情况下,您需要:

  1. 使用map代替Iterator,这使vec的寿命比函数调用的寿命长
  2. iterinto_iter的{​​{1}}
map

https://play.integer32.com/?version=stable&mode=debug&edition=2018&gist=d290d17d0bb7b4ce1460c082e9064851