Rust中Vec::chunks借用问题:无法返回分片的解决方案咨询
解决按固定大小分片文本行并返回
Vec<Vec<&str>>的问题 类型差异说明
Vec<&[&str]>:元素是切片引用,完全依赖原始Vec<&str>的生命周期,一旦原始数据被释放,这些引用就会变成悬垂引用,触发编译错误。Vec<Vec<&str>>:每个元素是独立的Vec,拥有自己的元素存储(这里的&str引用来自include_str!生成的静态字符串,生命周期为'static,程序运行期间始终有效)。
稳定版解决方案
方法1:转换chunk为Vec
直接对chunks返回的每个切片调用.to_vec(),将切片转为独立的Vec,摆脱对原始lines_info的生命周期依赖:
fn read_input() -> Vec<Vec<&'static str>> { let input = include_str!(r"PATH\input.txt"); let lines_info = input.lines().collect::<Vec<&'static str>>(); lines_info.chunks(7).map(|chunk| chunk.to_vec()).collect() }
这里使用'static生命周期是因为include_str!加载的字符串是静态存储的,无需自定义函数生命周期参数。
方法2:手动遍历分组
如果不想先将所有行收集到中间Vec,可以直接遍历行并手动分组:
fn read_input() -> Vec<Vec<&'static str>> { let input = include_str!(r"PATH\input.txt"); let mut result = Vec::new(); let mut current_chunk = Vec::with_capacity(7); for line in input.lines() { current_chunk.push(line); if current_chunk.len() == 7 { result.push(current_chunk); current_chunk = Vec::with_capacity(7); } } // 保留最后一组不足7行的内容(不需要可删除此段) if !current_chunk.is_empty() { result.push(current_chunk); } result }
关于array_chunks的错误说明
array_chunks::<7>()是Rust的不稳定API,仅在nightly版本编译器中可用。如果必须使用固定大小数组作为子元素,稳定版中可以手动实现分组逻辑,或使用itertools等第三方库的相关方法,但如果目标只是Vec<Vec<&str>>,上述两种方法已完全满足需求。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

