#[Async]Expand description
业务作用:# #[Async] —— 简单异步执行
贴在【带参/零参均可】的 async fn foo(args) -> T 上。编译期改写成【同步函数】
fn foo(args) -> JoinHandle<T>:调用即 tokio::spawn 原体到后台、立即返回 JoinHandle<T>
(实现 Future,可 .await 取结果,也可丢弃 = fire-and-forget),不阻塞调用方。
§参数
无(#[Async] 不带任何参数)。
§用法示例
ⓘ
#[Async]
async fn send_mail(to: String) -> bool { /* ... */ } // 改写后:fn send_mail(to: String) -> JoinHandle<bool>
send_mail("a@b.com".into()); // fire-and-forget:调用即后台跑,立即返回
let ok = send_mail("a@b.com".into()).await?; // 也可 .await 拿结果(JoinHandle 实现 Future)⚠️ 走 tokio::spawn:参数与返回值 T 都须 Send + 'static(参数取自有值,如 String 而非 &str)。
需要有人【调用】才会执行(对照 #[scheduled] 是自动跑)。
§实例方法 / impl 块
可用于满足 Send + 'static 的方法:owned self 或 self: Arc<Self> 接收者 + owned 参数。
不可用于 &self / &mut self(后台任务不能捕获借用接收者)——宏会直接 compile_error 提示改用 self: Arc<Self>。
也可贴在 inherent impl 块上,批量改写块内所有 async 方法;块内出现同步方法会 compile_error;
const/type 等非方法项原样保留;impl 级与方法级 #Async 不可叠加,块内方法别再单独标 #Async)。
trait impl 不支持(改返回类型会破坏 trait 签名);标在 struct/trait 定义上也不支持。
ⓘ
#[Async]
impl Worker {
async fn run(self: std::sync::Arc<Self>) { /* ... */ } // 改写为 fn run(..) -> JoinHandle<()>
async fn poll() -> u32 { 0 } // 关联函数同样改写
// async fn bad(&self) {} // 编译错误:请改 Arc<Self>
}§参数
attr:#[Async(...)]括号内的编译期参数;当前必须为空。item: 被注解的 async 函数或 inherent impl 块的 token stream。