声明一个包含数组的结构,然后创建一个零初始化的示例,推荐的方法是什么?
下面是struct:
#[derive(Default)]
struct Histogram {
sum: u32,
bins: [u32; 256],
}
字符串
编译器错误:
error[E0277]: the trait bound `[u32; 256]: std::default::Default` is not satisfied
--> src/lib.rs:4:5
|
4 | bins: [u32; 256],
| ^^^^^^^^^^^^^^^^ the trait `std::default::Default` is not implemented for `[u32; 256]`
|
= help: the following implementations were found:
<[T; 14] as std::default::Default>
<&'a [T] as std::default::Default>
<[T; 22] as std::default::Default>
<[T; 7] as std::default::Default>
and 31 others
= note: required by `std::default::Default::default`
型
如果我尝试为数组添加缺少的初始化器:
impl Default for [u32; 256] {
fn default() -> [u32; 255] {
[0; 256]
}
}
型
我明白了:
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
--> src/lib.rs:7:5
|
7 | impl Default for [u32; 256] {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate
|
= note: the impl does not reference any types defined in this crate
= note: define and implement a trait or new type instead
型
我做错什么了吗?
5条答案
按热度按时间yftpprvb1#
Rust没有为所有数组实现
Default
,因为它没有非类型多态性。因此,Default
只为少数大小实现。但是,您可以为 * 您的类型 * 实现默认值:
字符串
u32
实现Default
一开始就很可疑;为什么是0
而不是1
?或者42
?没有好的答案,所以真的没有明显的默认值。czq61nw12#
恐怕你不能这样做,你需要为你的结构自己实现
Default
:字符串
数值类型与这种情况无关,它更像是固定大小数组的问题。它们仍然需要泛型数值字面量来原生地支持这类事情。
de90aj5v3#
如果你确定每个字段都初始化为零,这将起作用:
字符串
o75abkj44#
实际上,在撰写本文时,对固定长度数组的支持仍在标准库中进行散列:
https://github.com/rust-lang/rust/issues/7622
daolsyd05#
如果数组类型不是
Copy
,@MatthieuM.给出的答案将不起作用。在这种情况下,你可以使用std::array::from_fn()
,而不是显式指定每个元素(这对于泛型数组来说很繁琐,甚至是不可能的):字符串
如果您喜欢,也可以使用
array::map()
来执行此操作:型