Rust异步中临时值的生命周期:直接传值还是绑定let变量?
Rust中临时变量直接传参vs显式绑定的安全性问题
两种写法都是安全的,具体原因如下:
第一种写法的安全性
async fn work() { some_async_fn(&name()).await; }
name()返回的String是临时值,Rust编译器会自动延长该临时值的生命周期,使其覆盖整个.await表达式的执行周期。也就是说,在some_async_fn异步执行的全过程中,这个临时String都会保持有效,不会被提前销毁,因此传入的引用完全合法。
第二种写法的作用
async fn work() { let n = name(); some_async_fn(&n).await; }
这种写法只是把临时值显式绑定到变量n上,本质和第一种写法没有区别——n的生命周期同样覆盖到.await执行结束,引用的有效性完全有保障。它的优势仅在于让代码逻辑更直观,或者当后续需要重复使用该String时更方便。
特殊情况提醒
如果some_async_fn存在将传入的引用存储到当前异步任务之外的场景(比如全局状态、长期运行的外部任务),那无论哪种写法都会触发生命周期错误,但这属于违背Rust生命周期规则的非法用法,和是否显式绑定变量无关。
内容的提问来源于stack exchange,提问作者Samuel Hapak
相关产品推荐
相关产品推荐

