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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:08