如何在Rust中默认初始化包含数组的结构体?

6ioyuze2  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(133)

声明一个包含数组的结构,然后创建一个零初始化的示例,推荐的方法是什么?
下面是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


我做错什么了吗?

yftpprvb

yftpprvb1#

Rust没有为所有数组实现Default,因为它没有非类型多态性。因此,Default只为少数大小实现。
但是,您可以为 * 您的类型 * 实现默认值:

impl Default for Histogram {
    fn default() -> Histogram {
        Histogram {
            sum: 0,
            bins: [0; 256],
        }
    }
}

字符串

  • 注意事项:我认为为u32实现Default一开始就很可疑;为什么是0而不是1?或者42?没有好的答案,所以真的没有明显的默认值。
czq61nw1

czq61nw12#

恐怕你不能这样做,你需要为你的结构自己实现Default

struct Histogram {
    sum: u32,
    bins: [u32; 256],
}

impl Default for Histogram {
    #[inline]
    fn default() -> Histogram {
        Histogram {
            sum: 0,
            bins: [0; 256],
        }
    }
}

字符串
数值类型与这种情况无关,它更像是固定大小数组的问题。它们仍然需要泛型数值字面量来原生地支持这类事情。

de90aj5v

de90aj5v3#

如果你确定每个字段都初始化为零,这将起作用:

impl Default for Histogram {
    fn default() -> Histogram {
        unsafe { std::mem::zeroed() }
    }
}

字符串

o75abkj4

o75abkj44#

实际上,在撰写本文时,对固定长度数组的支持仍在标准库中进行散列:
https://github.com/rust-lang/rust/issues/7622

daolsyd0

daolsyd05#

如果数组类型不是Copy,@MatthieuM.给出的答案将不起作用。在这种情况下,你可以使用std::array::from_fn(),而不是显式指定每个元素(这对于泛型数组来说很繁琐,甚至是不可能的):

impl Default for Histogram {
    fn default() -> Histogram {
        Histogram {
            sum: Default::default(),
            bins: std::array::from_fn(|_| Default::default()),
        }
    }
}

字符串
如果您喜欢,也可以使用array::map()来执行此操作:

impl Default for Histogram {
    fn default() -> Histogram {
        Histogram {
            sum: Default::default(),
            bins: [(); 256].map(|()| Default::default()),
        }
    }
}

相关问题