首页 > 解决方案 > Rust:我可以通过在更小的范围内以简单的方式借用整个固定大小的数组来获得固定大小的切片吗

问题描述

我看到了解决方法,它们有点长。我是否缺少 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?
}

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

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
}

但是我查看了板条箱,尽管这从不恐慌,但仍有许多不安全的块和许多代码行。这是 Rust 本身的一种解决方法。首先,我想要这样的东西来摆脱检查大小和可能的运行时恐慌的开销。

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

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

标签: rustslicelifetimeborrow-checker

解决方案


将 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

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


推荐阅读