我如何在 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
返回包含迭代器的 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);
}
关于collections - 如何在地址集合上调用 to_socket_addrs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53494845/