Rust中使用split赋值变量出现E0597生命周期错误求助
Rust生命周期错误:
s does not live long enough 解决方法 错误原因
问题核心是生命周期不匹配:
prev_key是定义在循环外的&str引用,生命周期覆盖整个main函数。- 循环内的
s是每次迭代创建的String,单次循环结束后就会被销毁。 data[0]是指向s内部的引用,将其赋值给prev_key后,s销毁时这个引用会变成悬空引用,Rust的安全机制直接阻止了这种危险行为。
解决方案
把prev_key的类型从引用&str改为拥有所有权的String,让它直接持有字符串内容,不再依赖外部的s:
use std::io; fn main() { let mut prev_key: String = String::new(); for line in io::stdin().lines(){ let s = line.unwrap(); let data: Vec<&str> = s.split("\t").collect(); if prev_key.is_empty() { prev_key = data[0].to_string(); } } }
修改说明
- 将
prev_key初始化为空String,替代空引用&"",拥有独立的所有权。 - 赋值时调用
to_string()将&str转换为String,把字符串内容的所有权转移给prev_key,即使s被销毁,prev_key依然持有完整数据。 - 使用
is_empty()替代len() == 0,是Rust中判断空字符串的惯用写法。
内容的提问来源于stack exchange,提问作者Shomy
相关产品推荐
相关产品推荐

