如何操作 Rust 数组的 2 个可变切片?

2024-04-30

我有一个函数需要对单个数组的两个部分进行操作。 目的是能够建立一个#[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]);
}

错误如下:

error[E0499]: cannot borrow `*item` as mutable more than once at a time
 --> src/main.rs:2:32
  |
2 |     (&mut item[0..place], &mut item[place..])
  |           ----                 ^^^^ second mutable borrow occurs here
  |           |
  |           first mutable borrow occurs here
3 | }
  | - first borrow ends here

这种模式对于就地快速排序等也很有帮助。

对同一数组的不重叠切片有两个可变引用有什么不安全的地方吗?如果纯 Rust 没有办法,是否有“安全”unsafe能让事情继续进行的咒语?


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

没有,但 Rust 的类型系统当前无法检测到您正在对切片的两个非重叠部分进行可变引用。由于这是一个常见的用例,Rust 提供了一个安全的函数来完全满足您的需求:std::slice::split_at_mut https://doc.rust-lang.org/std/primitive.slice.html#method.split_at_mut.

fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

除一&mut在索引处分成两部分。

第一个将包含来自的所有索引[0, mid)(不包括指数mid本身),第二个将包含来自的所有索引[mid, len)(不包括指数len本身)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何操作 Rust 数组的 2 个可变切片? 的相关文章

随机推荐