Rust 是否可以等待a&;戴恩的未来?

Rust 是否可以等待a&;戴恩的未来?,rust,async-await,Rust,Async Await,我正在尝试异步调用从函数返回的Future。可能吗 使用核心::未来::未来; fn选择你的冒险{ 比赛一{ 0=>Box::new(&async{}), _=>Box::新建(&async{}) } } 异步fn不工作()->(){ 让选择=选择你的冒险(0); choice.await;//错误[E0277]:`&dyn Future`不是未来 } 否。轮询未来需要它是可变的。不可变的引用不能通过设计进行变异 在这种情况下,您不需要框。我会编写没有trait对象的代码: async fn选择

我正在尝试异步调用从函数返回的
Future
。可能吗

使用核心::未来::未来;
fn选择你的冒险{
比赛一{
0=>Box::new(&async{}),
_=>Box::新建(&async{})
}
}
异步fn不工作()->(){
让选择=选择你的冒险(0);
choice.await;//错误[E0277]:`&dyn Future`不是未来
}

否。轮询未来需要它是可变的。不可变的引用不能通过设计进行变异

在这种情况下,您不需要
。我会编写没有trait对象的代码:

async fn选择你的冒险(i:usize){
比赛一{
0 => (),
_ => (),
}
}
如果你的心集中在一个特质对象上,那么就没有必要有一个装箱的参考:

fn选择你的冒险(i:usize)->Box{
比赛一{
0=>Box::new(异步{}),
_=>Box::新建(异步{}),
}
}
尽管最好使用futures板条箱中的类型别名:

use futures::{future::BoxFuture,FutureExt};//0.3.14
fn选择你的冒险(i:usize)->BoxFuture>
,这表示未来可能被取消固定(如果
T:Unpin

另见:


否。轮询未来需要它是可变的。不可变的引用不能通过设计进行变异

在这种情况下,您不需要
。我会编写没有trait对象的代码:

async fn选择你的冒险(i:usize){
比赛一{
0 => (),
_ => (),
}
}
如果你的心集中在一个特质对象上,那么就没有必要有一个装箱的参考:

fn选择你的冒险(i:usize)->Box{
比赛一{
0=>Box::new(异步{}),
_=>Box::新建(异步{}),
}
}
尽管最好使用futures板条箱中的类型别名:

use futures::{future::BoxFuture,FutureExt};//0.3.14
fn选择你的冒险(i:usize)->BoxFuture>
,这表示未来可能被取消固定(如果
T:Unpin

另见:


如果
&T
未来
,只需将
&T
作为
动态未来
返回即可。虽然通常情况下,您会使用自己的未来类型。如果
&T
未来类型
,只需将
&T
作为
dyn未来类型
返回即可。虽然通常情况下,您将使用自己的未来类型。“轮询未来需要它是可变的”Doh!我早该知道的。“相反,当我尝试
dyn Future
时,返回装箱的trait对象”,然后它告诉我它没有实现Unpin添加+Unpin只会引发另一个问题,即某些东西如何“无法取消固定”。是否可以异步调用返回的内容?@MattThomas
async
块不能取消固定。您可以返回
Pin
(或者使用
Box future
类型别名)和
Box::Pin
未来。“轮询未来需要它是可变的”Doh!我早该知道的。“相反,当我尝试
dyn Future
时,返回装箱的trait对象”,然后它告诉我它没有实现Unpin添加+Unpin只会引发另一个问题,即某些东西如何“无法取消固定”。是否可以异步调用返回的内容?@MattThomas
async
块不能取消固定。您可以返回
Pin
(或者使用
Box future
类型别名)和
Box::Pin
future。