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

为何在Rust中内联调用iter和collect无生命周期问题?

Rust临时向量的引用为何能正常运行?

问题代码

println!("{:?}", (vec!["1".to_string(), "1".to_string(), "1".to_string()]).iter().collect::<Vec<&String>>());

疑问

我原本的理解是:这条语句先创建一个拥有所有权的String向量,获取String引用的迭代器,再收集为String引用的向量。但我觉得这个被引用的向量应该在语句执行初期就被销毁了,为什么程序还能正常运行?

解答

这是因为Rust里临时变量的生命周期会被延长到包含它的整个表达式结束。

你这里创建的Vec<String>是个临时值,它的生命周期会覆盖整个println!调用的完整表达式——从创建向量、调用iter()生成迭代器,到collect成Vec<&String>,最后把这个引用向量传给println!打印完成,整个过程中临时Vec<String>都还处于存活状态。

只有当整个println!语句执行完毕后,这个临时向量才会被销毁,而此时那些引用已经完成了打印的使命,完全不会出现悬垂引用的问题。

说白了就是:Rust会确保临时值存活到用到它的最后一步操作结束,不会提前销毁。


内容的提问来源于stack exchange,提问作者Danilo Souza Morães

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:40:53