我有一个数组的自定义类型,我想初始化该类型的变量。它看起来像这样:
type Registers = [u8; 16];
fn main() {
let mut registers: Registers;
}
我不想做类似下面的事情,因为在某些时候我可能想要改变我的数组类型的大小:
let mut registers: Registers = [0; 16];
有没有办法只使用类型的名称来初始化变量?我是否被迫像上面那样指定初始化?
我的问题与Can array lengths be inferred in Rust?略有不同,因为数组的大小应该从类型本身推断出来,而不是从值推断出的数组类型。
答案 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()
}
}