首页 > 解决方案 > 使用 split_mut 或类似方法对切片的不相交部分进行多个可变引用

问题描述

Rust 的split_mut函数允许您通过谓词分割切片。但是,谓词作用于切片的元素。例子:

let mut v = [10, 40, 30, 20, 60, 50];

for group in v.split_mut(|num| *num % 3 == 0) {
    group[0] = 1;
}
assert_eq!(v, [1, 40, 30, 1, 60, 1]);

我可以像这样将一个切片分成相等的部分:

let mut v = [1,2,3,4,5,6,7,8,9];

并得到

&mut[1,2,3]并且&mut[4,5,6]&mut[7,8,9]

在usch中,所有这些可变变量可以同时存在而我没有编译问题吗?我想对切片的不相交部分有多个可变引用,但谓词应该在切片的索引上,而不是在元素上。

标签: rust

解决方案


正如Jmb所建议的那样

您可以使用split_at_mut将可变切片分成 2 个不重叠的可变切片。

fn main() {
    let mut v = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    // Needs to be a multiple of v
    let number_of_parts = 5;

    let mid = v.len() / number_of_parts;

    let mut res = Vec::new();

    let mut ret = &mut v[..];

    for _ in 0..number_of_parts {
        let (head, tail) = ret.split_at_mut(mid);
        res.push(head);
        ret = tail;
    }

    println!("Parts: {:?}.", res);
}

正如Õmer Erden所建议的那样

您可以使用chunks_mut迭代可变切片并返回不重叠的可变切片。

fn main() {
    let mut v = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    // Needs to be a multiple of v
    let number_of_parts = 5;

    let mid = v.len() / number_of_parts;

    let mut res = Vec::new();

    for chunk in v.chunks_mut(mid) {
        res.push(chunk);
    }

    println!("Parts: {:?}.", res);
}


推荐阅读