Rust循环内构造数据存入外部向量的生命周期问题求助
Rust生命周期问题:循环内字符串片段存入外部向量的解决办法
为什么原代码不被允许
你的代码里,循环内的string是String类型(注释里有误,stdin_result.unwrap()返回的是String而非&str)。调用split方法得到的&str是指向string内部数据的引用,这些引用的生命周期和string完全绑定。
每次循环结束时,string会因离开作用域被自动销毁,其占用的内存会被释放。如果把这些引用存入外部的lines_left向量,向量里就会留下悬垂引用——指向已经被释放的内存,这会引发程序崩溃或未定义行为。Rust的生命周期检查机制正是为了避免这类风险,所以直接抛出E0597错误阻止该操作。
解决方案:复制引用指向的内容
要解决这个问题,你需要把引用指向的字符串内容复制一份,存入拥有所有权的String类型,而非存储引用。具体修改如下:
- 将外部向量的类型从
Vec<&str>改为Vec<String>,让向量直接持有字符串的所有权,不再依赖循环内的string。 - 在
push时调用to_string()或into()方法,把&str转换为String,完成内容复制。
修改后的代码:
use std::io::{self, BufRead}; fn main() { let stdin = io::stdin(); // 向量存储拥有所有权的String,而非引用 let mut lines_left: Vec<String> = Vec::new(); for stdin_result in stdin.lock().lines() { let string = stdin_result.unwrap(); let words: Vec<&str> = string.split("|").collect(); // 将&str转换为String,复制内容到向量中 lines_left.push(words[0].to_string()); } }
修改后,每次循环都会把words[0]指向的字符串内容复制一份,生成新的String存入lines_left。循环结束后原string销毁,也不会影响向量里的内容,完全符合Rust的所有权规则。
内容的提问来源于stack exchange,提问作者Goes S'epouse
相关产品推荐
相关产品推荐

