如何在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}}。
答案 0 :(得分:2)
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);
}