Rust循环中出现'buffer'生命周期不足编译错误求助
解决Rust中“'buffer' does not live long enough”编译错误
错误原因
问题核心是生命周期不匹配:
buffer是loop每次迭代里创建的局部变量,迭代结束后会被Rust自动销毁释放内存。words里的所有&str都是对buffer内容的引用,你把这些引用(employee和department)存入了循环外的companyHashMap。- 当当前循环迭代结束,
buffer被销毁,HashMap里的引用就变成了指向无效内存的悬空引用——这违反了Rust的内存安全规则,因此编译器报错阻止你。
你之前的误解在于:虽然每次循环会创建新的buffer,但company存活在整个main函数周期内,它不能持有比自身生命周期更短的变量引用。
修复方案
把引用类型的&str转换成拥有所有权的String,让HashMap存储独立的数据,不再依赖buffer的生命周期。具体修改两处:
use std::{collections::HashMap, io}; fn main() { println!("Enter an employee name and department to add that employee to a department."); let mut company = HashMap::new(); loop { let mut buffer = String::new(); io::stdin() .read_line(&mut buffer) .expect("Failed to read line"); let words: Vec<&str> = buffer.trim().split(" ").collect(); match words[0].to_lowercase().as_str() { "exit" => break, "show" => match words[1].to_lowercase().as_str() { "company" => println!("Show all employees"), "department" => println!("Show all people in {} department", words[1]), _ => continue, }, "add" => match words[2].to_lowercase().as_str() { "to" => { // 将&str转为String,获得数据所有权 let employee = words[1].to_string(); let department = words[3].to_string(); let hash_department = company.entry(department).or_insert(vec![]); hash_department.push(employee); } _ => continue, }, _ => continue, } println!("{:?}", company); } }
为什么这样改
to_string()会创建新的String,拷贝原引用指向的内容,这个新字符串的生命周期和company一致(直到main函数结束)。- HashMap现在存储的是
String类型的键和值,不再依赖临时的buffer,彻底解决了生命周期不匹配的问题。
内容的提问来源于stack exchange,提问作者Clarence
相关产品推荐
相关产品推荐

