Asynchronous 在没有匹配语句的情况下,是否可以在结果中等待未来?

Asynchronous 在没有匹配语句的情况下,是否可以在结果中等待未来?,asynchronous,rust,rust-tokio,Asynchronous,Rust,Rust Tokio,我有下面的实现块,它不是很可读 impl-Xbee{ 异步fn新建(xbee_ip:Ipv4Addr)->结果{ 匹配tokio::net::UdpSocket::bind((Ipv4Addr::未指定,0))。等待 .map(|套接字|异步{ 匹配插座。连接((xbee_ip,3054))。等待{ 正常()=>正常(Xbee{ ip:xbee_ip, 插座:插座, 上次查看:SystemTime::now(), }), Err(error)=>Err(error) } }) { Ok(xbee

我有下面的实现块,它不是很可读

impl-Xbee{
异步fn新建(xbee_ip:Ipv4Addr)->结果{
匹配tokio::net::UdpSocket::bind((Ipv4Addr::未指定,0))。等待
.map(|套接字|异步{
匹配插座。连接((xbee_ip,3054))。等待{
正常()=>正常(Xbee{
ip:xbee_ip,
插座:插座,
上次查看:SystemTime::now(),
}),
Err(error)=>Err(error)
}
}) {
Ok(xbee)=>xbee.wait,
Err(Err)=>Err(Err),
}
}
}

首先,我想删除最外层的
match
语句,它只是在返回结果之前等待结果内部的未来。这似乎是
结果的一个很好的候选者:{and_then,map,map或,map或{else}
等等,但是,我认为这些都不起作用,因为
等待
将在
异步
闭包中结束,需要
wait
ed。是否可以
wait
在没有
match
语句的情况下在结果中等待未来?

这并不能回答上述问题,但是,通过正确使用
运算符,通过首先不在结果中包含未来,可以使上述代码更具可读性。重构代码:

impl-Xbee{
异步fn新建(xbee_ip:Ipv4Addr)->结果{
让socket=tokio::net::UdpSocket::bind((Ipv4Addr::UNSPECIFIED,0)).wait?;
插座。连接((xbee_ip,3054))。等待?;
设xbee=xbee{
ip:xbee_ip,
插座:插座,
上次查看:SystemTime::now(),
};
Ok(xbee)
}
}

由于您设法创建了一个
结果
而不是
impl Future
,因此答案是否定的,您不能。但是,如果您修复了代码,您可以应用速记
操作符。您能否在回答中详细说明创建
impl Future
的过程以及如何解决问题?它可以看起来像
async{Ok(())}
,可以像
x.wait?
而不是
match x{Ok(x)一样访问=>x.await,Err(e)=>返回Err(e)}
。事实上,
impl Future
将是您的tokio方法的返回类型,但是你的
.map
应用程序使你把未来放在结果中,而不是把结果放在未来中。这实际上并没有回答你自己的问题,除了说“不要这样做”之外,我部分同意,出于这个原因,我不会接受它。然而,我认为它对其他人仍然有用,尽管他们和我一样,已经过多地研究了这个简单的变通方法。@msrd0我编辑了这个答案,以明确这不是对所问问题的回答,而是一个变通方法