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

Rust循环内构造数据存入外部向量的生命周期问题求助

Rust生命周期问题:循环内字符串片段存入外部向量的解决办法

为什么原代码不被允许

你的代码里,循环内的string是String类型(注释里有误,stdin_result.unwrap()返回的是String而非&str)。调用split方法得到的&str是指向string内部数据的引用,这些引用的生命周期和string完全绑定。

每次循环结束时,string会因离开作用域被自动销毁,其占用的内存会被释放。如果把这些引用存入外部的lines_left向量,向量里就会留下悬垂引用——指向已经被释放的内存,这会引发程序崩溃或未定义行为。Rust的生命周期检查机制正是为了避免这类风险,所以直接抛出E0597错误阻止该操作。

解决方案:复制引用指向的内容

要解决这个问题,你需要把引用指向的字符串内容复制一份,存入拥有所有权的String类型,而非存储引用。具体修改如下:

  1. 将外部向量的类型从Vec<&str>改为Vec<String>,让向量直接持有字符串的所有权,不再依赖循环内的string。
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:32