Rust:我可以通过以简单的方式借用较小范围内的整个固定大小数组来获得固定大小的切片吗

par*_*oid 2 lifetime slice rust borrow-checker

我看到了解决方法,它们有点长。我是否缺少 Rust 的某个功能或简单的解决方案(重要:不是解决方法)。我觉得我应该能够用一个简单的宏来做到这一点,但 arrayref crate 实现不是我想要的。这是一个需要添加到 Rust 的功能吗?还是在较小的范围内从固定大小的数组创建固定大小的切片是一件坏事。基本上我想做的是这个;

fn f(arr:[u8;4]){
    arr[0];
}

fn basic(){
    let mut arr:[u8;12] = [0;12];
    // can't I borrow the whole array but but a fixed slice to it?
    f(&mut arr[8..12]); // But this is know on compile time?
    f(&mut arr[8..12] as &[u8;4]); // Why can't I do these things?
}
Run Code Online (Sandbox Code Playgroud)

我想要的可以通过下面的代码来实现(来自其他线程)

use array_ref;

fn foo(){
    let buf:[u8;12] = [0;12];
    let (_, fixed_slice) = mut_array_refs![
        &mut buf,
        8,
        4
    ];
    write_u32_into(fixed_slice,0);
}

fn write_u32_into(fixed_slice:&mut [u8;12],num:u32){
    // won't have to check if fixed_slice.len() == 12 and won't panic
}
Run Code Online (Sandbox Code Playgroud)

但我查看了箱子,尽管这永远不会恐慌,但仍有许多不安全的块和许多行代码。这是 Rust 本身的解决方法。首先,我想要这样的东西来消除检查大小的开销和可能的运行时恐慌。

另外,这只是一点开销,没关系,这不是一个有效的答案,因为从技术上讲,我应该能够在编译时保证这一点,即使开销很小,这并不意味着 rust 不需要这种类型的功能,否则我不应该寻找理想的方法。注意:这个问题可以用生命周期来解决吗?

编辑:如果我们能够对固定切片(例如 arr[12;;16] )使用不同的语法,并且当我以这种方式借用它们时,它会借用整个 arr。我认为这样许多函数(例如write_u32)将以更“生锈”的方式实现。

Dea*_*eef 6

使用 let 与slice_patterns功能绑定。它在 Rust 1.42 中稳定下来。

let v = [1, 2, 3]; // inferred [i32; 3]
let [_, ref subarray @ ..] = v; // subarray is &[i32; 2]
let a = v[0]; // 1
let b = subarray[1]; // 3
Run Code Online (Sandbox Code Playgroud)

是 Rust 参考中有关切片模式的部分。