代码之家  ›  专栏  ›  技术社区  ›  Petrus Theron

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

  •  0
  • Petrus Theron  · 技术社区  · 7 年前

    我该怎么称呼 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 ,而不是 ws::listen .

    1 回复  |  直到 7 年前
        1
  •  2
  •   starblue    7 年前

    to_socket_addrs 返回A 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);
    }