Как передать Iterator <String>в качестве Iterator <& str> в ржавчине? - PullRequest
1 голос
/ 02 мая 2019
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 ]

6 голосов
/ 02 мая 2019

Еще лучшим способом было бы написать функцию в таким образом, что на самом деле это не волнует :

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

Если вы не можете изменить сигнатуру функции, вам нужно предварительно преобразовать итератор :

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 голос
/ 02 мая 2019

Как мне преобразовать Iterator<T> в Iterator<U> и передать его другой функции?

Вы используете функцию map адаптера Iterator.


В вашем конкретном случае вам необходимо:

  1. используйте iter вместо into_iter, что заставляет vec жить дольше, чем вызов функции
  2. map от String с до &str
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()));
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...