You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust异步函数打印变量及main调用Future返回值报错问题

问题根源
  • Rust中async修饰的函数不会直接返回声明的String类型值,而是返回一个实现了Future<Output = String>的惰性对象:只有主动驱动这个Future执行、等待它运行完成,才能拿到真正的字符串结果。
  • 直接打印Future对象会触发impl Future<Output = String> doesn't implement std::fmt::Display报错,因为Future本身没有实现打印所需的Display trait。
  • 把打印语句写在异步函数内部却看不到输出,也是因为Future没有被驱动执行:异步函数里的代码在Future被轮询运行前不会执行任何逻辑,自然不会触发打印。
修复方案

Rust异步代码必须依托异步运行时才能执行,egg-mode依赖通用的tokio运行时,按以下步骤修改即可:

  1. 首先在Cargo.toml中添加必要依赖:
[dependencies]
egg-mode = "0.16"
tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }
  1. 修改main函数,使用tokio提供的异步入口宏,直接await异步函数拿结果:
pub async fn twitterauth() -> String {
    let con_token = egg_mode::KeyPair::new("public_token", "secret_token");
    let request_token = egg_mode::auth::request_token(&con_token, "oob").await.unwrap();
    let auth_url = egg_mode::auth::authorize_url(&request_token);

    return auth_url;
}

fn output() -> impl Future<Output = String> {
    twitterauth()
}

// 标记异步入口,自动初始化tokio运行时
#[tokio::main]
async fn main() {    
    // 等待异步任务执行完成,拿到真实的字符串返回值
    let authurl = output().await;    
    println!("{}", authurl);
}

如果不想用宏生成异步入口,也可以手动创建运行时阻塞执行异步任务,适合需要在同步逻辑中调用异步函数的场景:

fn main() {    
    // 手动初始化tokio运行时
    let runtime = tokio::runtime::Runtime::new().unwrap();
    // 阻塞当前线程等待异步任务执行完成,拿到返回值
    let authurl = runtime.block_on(output());
    println!("{}", authurl);
}
注意事项
  • 所有async函数、返回Future的异步任务,都必须在异步运行时上下文中通过.await,或者用运行时的block_on方法驱动执行,才能拿到真实返回值。
  • 不要尝试直接把Future对象当做同步返回值使用,它只是一个存放了异步任务执行逻辑的占位对象,本身不包含最终的执行结果。

内容的提问来源于stack exchange,提问作者zun1uwu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:51:20