如何从变量类型推断出一个长度的数组?

时间:2018-04-04 21:08:56

标签: rust

我有一个数组的自定义类型,我想初始化该类型的变量。它看起来像这样:

type Registers = [u8; 16];

fn main() {
    let mut registers: Registers;
}

我不想做类似下面的事情,因为在某些时候我可能想要改变我的数组类型的大小:

let mut registers: Registers = [0; 16];

有没有办法只使用类型的名称来初始化变量?我是否被迫像上面那样指定初始化?

我的问题与Can array lengths be inferred in Rust?略有不同,因为数组的大小应该从类型本身推断出来,而不是从值推断出的数组类型。

2 个答案:

答案 0 :(得分:5)

您无法推断数组的长度,因为它是必须在编译时计算的表达式。据我所知,“推断表达”的概念没有意义。

  

我可能想要更改数组类型的大小

通过引入常量可以避免这个问题:

const N_REGISTERS: usize = 16;
type Registers = [u8; N_REGISTERS];

fn main() {
    let mut registers: Registers = [0; N_REGISTERS];
}

您也可以使用数组的Default实现,但仅适用于certain sizes of array,并且仅当您需要数组的元素类型的默认值时:

type Registers = [u8; 16];

fn main() {
    let mut registers = Registers::default();
}

答案 1 :(得分:2)

只要const generics不可用,就不会为所有数组类型实现Default。这使得数组初始化不像您所经历的那样符合人体工程学。

作为一种常用的替代方法,您可以将类型别名转换为新类型,使用该类型可以将数组初始化隔离到代码中的单个点。

pub struct Registers(pub [u8; 16]);

impl Default for Registers {
    fn default() -> Self {
        Registers([0; 16])
    }
}

此时,根据您的使用情况,您还可以为此类型实施其他有用的特征,例如AsRef<u8>AsMut<u8>

impl AsRef<[u8]> for Registers {
    fn as_ref(&self) -> &[u8] {
        self.0.as_ref()
    }
}