Rust遍历Vec的for循环中使用format!报临时值生命周期错误如何解决
问题根因
format!宏执行后会返回一个拥有所有权的String类型临时值,你调用as_str()方法得到的字符串切片,本质是对这个临时String内部数据的借用。按照Rust的生命周期规则,这个临时String在当前语句执行结束后就会被销毁,你把对应的切片赋值给Vec<&str>存储,相当于存储了一个悬垂引用,编译器会因为生命周期不匹配报错:Vec中存储的&str要求生命周期至少和函数参数标注的'1生命周期一样长,但临时值的生命周期仅持续到当前语句结束,无法满足要求。
修复方案
根据你的业务场景可以选择两种修复方式:
- 方案1:修改
Vec存储类型为String(最推荐)
直接存储拥有所有权的String类型,完全规避生命周期问题,也是Rust处理动态字符串的标准实现:
fn connect_pesel(names: &mut Vec<String>){ let mut rng = rand::thread_rng(); for i in 0..names.len(){ names[i] = format!("{} {}", names[i], rng.gen_range(1000..9999)); } }
注:代码中按照Rust官方命名规范将函数名和参数名调整为蛇形命名格式。
- 方案2:保留
Vec<&str>存储结构
如果上层逻辑必须使用Vec<&str>,你需要额外维护一个和&str生命周期一致的容器来持有生成的String所有权,避免临时值被销毁:
fn connect_pesel<'a>(names: &mut Vec<&'a str>, owned_buffer: &'a mut Vec<String>){ let mut rng = rand::thread_rng(); for i in 0..names.len(){ let new_str = format!("{} {}", names[i], rng.gen_range(1000..9999)); owned_buffer.push(new_str); names[i] = owned_buffer.last().unwrap().as_str(); } }
该方案需要在调用函数前提前创建owned_buffer容器,且要保证其生命周期和names参数的生命周期一致,实现复杂度更高,非必要场景不建议使用。
内容的提问来源于stack exchange,提问作者urioTV
相关产品推荐
相关产品推荐

