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

标签 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`

我花了两个小时才理解这个错误,因为“trait X is not implemented for std::iter::FlatMap”读起来好像问题是由 flat_map,而不是ws::listen的要求。

最佳答案

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

关于collections - 如何在地址集合上调用 to_socket_addrs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53494845/

相关文章:

c++ - 查找迭代器的值类型

java - ListIterator 或 Iterator 不会在 List 末尾停止

java - 列表中子列表中的最大值

ruby-on-rails - Ruby Rails 集合选择显示空白 "prompt"值?

java - 导入 csv 不使用 opencsv 执行搜索

python - 订购两台已排序的发电机,无需进口

.net - .Net中具有Count属性的最小接口(interface)是什么

vector - "std::vec"与 "collections::vec"

rust - 如何结合 `Ord::cmp()`中的两个cmp条件

rust - 如何拆分、去抖动和加入流?