如何在地址集合上调用to_socket_addrs?

时间:2018-11-27 07:39:29

标签: collections rust iterator

如何在Rust中的数组或向量上调用to_socket_addrs()?以下代码无法编译:

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`

我花了两个小时的时间来理解该错误,因为“ X未实现特征std::iter::FlatMap”的读取内容似乎是问题是由flat_map而不是{{ 1}}。

1 个答案:

答案 0 :(得分:2)

to_socket_addrs返回包含迭代器的ResultResult本身实现了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);
}