Rust 如何操作锈菌阵列的2个可变切片?

Rust 如何操作锈菌阵列的2个可变切片?,rust,slice,lifetime,Rust,Slice,Lifetime,我有一个函数需要在单个数组的两个部分上运行。 其目的是能够构建一个#[nostd]分配器,该分配器可以向调用者返回较大数组的一个可变片段,并保留数组的其余部分以供将来分配 下面是失败的示例代码: fn split<'a>(mut item: &'a mut [i32], place: usize) -> (&'a mut [i32], &'a mut [i32]) { (&mut item[0..place], &mut item

我有一个函数需要在单个数组的两个部分上运行。 其目的是能够构建一个
#[nostd]
分配器,该分配器可以向调用者返回较大数组的一个可变片段,并保留数组的其余部分以供将来分配

下面是失败的示例代码:

fn split<'a>(mut item: &'a mut [i32], place: usize) -> (&'a mut [i32], &'a mut [i32]) {
    (&mut item[0..place], &mut item[place..])
}

fn main() {
    let mut mem: [i32; 2048] = [1; 2048];
    let (mut array0, mut array1) = split(&mut mem[..], 768);
    array0[0] = 4;
    println!("{:?} {:?}", array0[0], array1[0]);
}
此模式也有助于就地快速排序等

对同一数组中不重叠的切片使用两个可变引用有什么不安全的地方吗?如果纯粹的生锈是不可能的,那么是否有一个“安全的”
unsafe
咒语允许它继续

对同一数组中不重叠的切片使用两个可变引用有什么不安全的地方吗

没有,但Rust的类型系统目前无法检测到您正在对一个切片的两个不重叠部分进行可变引用。因为这是一个常见的用例,所以Rust提供了一个安全的函数,可以精确地执行您想要的操作:

fn在mut(&mut-self,mid:usize)->(&mut[T],&mut[T])上拆分

在索引处将一个
&mut
分成两个

第一个将包含
[0,mid)
中的所有索引(不包括索引
mid
本身),第二个将包含
[mid,len)
(不包括索引
len
本身)

最后的代码是:

fn main() {
    let mut mem : [i32; 2048] = [1; 2048];
    let (mut array0, mut array1) = mem[..].split_at_mut(768);
    array0[0] = 4;
    println!("{:?} {:?}", array0[0], array1[0]);
}
哇,真是完美的搭配。谢谢你找到这个