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运行时,按以下步骤修改即可:
- 首先在
Cargo.toml中添加必要依赖:
[dependencies] egg-mode = "0.16" tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }
- 修改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
相关产品推荐
相关产品推荐

