Rust如何基于索引拆分slice获取多个不相交的可变引用?
固定等长拆分(直接用标准库方法)
如果你的需求就是固定长度拆分,直接使用标准库原生的chunks_mut方法即可,该方法返回的迭代器产出的所有可变切片都是互不相交的,完全符合可变引用同时存在的编译要求:
let mut v = [1,2,3,4,5,6,7,8,9]; let mut chunks = v.chunks_mut(3); assert_eq!(chunks.next(), Some(&mut [1,2,3])); assert_eq!(chunks.next(), Some(&mut [4,5,6])); assert_eq!(chunks.next(), Some(&mut [7,8,9])); assert_eq!(chunks.next(), None);
如果你需要剩余不足指定长度的部分单独作为最后一块,用chunks_mut即可;如果需要舍弃不足长度的部分,可以换成rchunks_exact_mut或者chunks_exact_mut方法。
自定义索引规则拆分
如果需要实现更灵活的、根据自定义索引逻辑拆分的能力,可以基于标准库的split_at_mut方法封装,该方法可以将切片切为两个不相交的可变切片,我们可以迭代调用完成多次拆分:
/// 按指定的拆分索引列表对切片做可变拆分,所有拆分位置相对于原始切片的起始索引 fn split_at_indices_mut<T>(slice: &mut [T], split_indices: &[usize]) -> Vec<&mut [T]> { let mut result = Vec::new(); let mut current = slice; let mut last_pos = 0; for &idx in split_indices { let offset = idx - last_pos; if offset > current.len() { break; } let (left, right) = current.split_at_mut(offset); result.push(left); current = right; last_pos = idx; } if !current.is_empty() { result.push(current); } result } // 调用示例:和等长3拆分效果一致,拆分位置为原始切片的索引3、6处 fn main() { let mut v = [1,2,3,4,5,6,7,8,9]; let groups = split_at_indices_mut(&mut v, &[3, 6]); assert_eq!(groups[0], &mut [1,2,3]); assert_eq!(groups[1], &mut [4,5,6]); assert_eq!(groups[2], &mut [7,8,9]); }
以上两种方案的所有可变引用都是标准库保证不相交的,不会触发借用编译错误。
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

