【发布时间】:2026-01-19 07:00:02
【问题描述】:
我最近开始在 Rust 中使用异步流,并且我不断发现自己处于想要在 Stream 的实现中使用异步函数的情况。异步函数通常来自我无法控制的库,但为了举例,假设它们看起来像这样:
async fn bar_str(s: &str) -> String {
s.to_string()
}
async fn bar_string(s: String) -> String {
s
}
为了简单起见,假设我只是想使用这些函数来实现如下特征(不涉及实际的流内容):
use std::future::Future;
trait Foo {
fn bar(self) -> Box<dyn Future<Output = String>>;
}
对于String 的情况,这就像您所期望的那样:
impl Foo for String {
fn bar(self) -> Box<dyn Future<Output = String>> {
Box::new(bar_string(self))
}
}
对于异步函数借用的情况,它不会。
impl Foo for &str {
fn bar(self) -> Box<Future<Output = String>> {
Box::new(bar_str(self))
}
}
编译失败:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter '_ in function call due to conflicting requirements
--> foo.rs:23:18
|
23 | Box::new(bar_str(self))
| ^^^^^^^^^^^^^
|
...
我可以理解为什么这是一个问题,并且我知道async fn 语法为像这样的借用参数提供了特殊处理(尽管我不知道它是如何实际检查、脱糖等的)。
我的问题是,在这些情况下,最好的做法是什么。有什么方法可以重现async fn 在我的非async fn 代码中所做的魔术吗?我是否应该避免借用异步函数(如果可以,因为这通常是我没有做出的决定)?在我目前正在编写的代码中,我很乐意使用实验性或非必要的面向未来的解决方案,如果它们使阅读和编写这种事情变得更好的话。
【问题讨论】:
标签: asynchronous rust