Как вызвать to_socket_addrs для коллекции адресов? - PullRequest
0 голосов
/ 27 ноября 2018

Как мне вызвать to_socket_addrs() для массива или вектора в Rust?Следующий код не компилируется:

extern crate ws;
use std::net::ToSocketAddrs;

fn main() {
    let addrs = ["127.0.0.1:8889", "127.0.0.1:0"]
        .iter()
        .flat_map(|a| a.to_socket_addrs());
    ws::listen(addrs, |out| move |msg| out.send(msg));
}
error[E0277]: the trait bound `std::iter::FlatMap<std::slice::Iter<'_, &str>, std::result::Result<std::vec::IntoIter<std::net::SocketAddr>, std::io::Error>, [closure@src/main.rs:7:19: 7:42]>: std::net::ToSocketAddrs` is not satisfied
 --> src/main.rs:8:5
  |
8 |     ws::listen(addrs, |out| move |msg| out.send(msg));
  |     ^^^^^^^^^^ the trait `std::net::ToSocketAddrs` is not implemented for `std::iter::FlatMap<std::slice::Iter<'_, &str>, std::result::Result<std::vec::IntoIter<std::net::SocketAddr>, std::io::Error>, [closure@src/main.rs:7:19: 7:42]>`
  |
  = note: required by `ws::listen`

Мне потребовалось два часа, чтобы понять ошибку, потому что "trait X не реализовано для std::iter::FlatMap", как будто проблема вызвана flat_map вместо требований ws::listen.

1 Ответ

0 голосов
/ 27 ноября 2018

to_socket_addrs возвращает Result, содержащий итератор.Result сам реализует IntoIterator, поэтому flat_map сглаживает результат, но не внутренний итератор, вам нужно сделать это на дополнительном шаге:

use std::net::ToSocketAddrs;

fn main() {
    let addrs = ["127.0.0.1:8889", "127.0.0.1:0"]
        .iter()
        .flat_map(|a| a.to_socket_addrs())
        .flatten()
        .collect::<Vec<_>>();
    println!("addrs = {:?}!", addrs);
}
...