簡體   English   中英

如何在Rust中默認初始化包含數組的結構?

[英]How to default-initialize a struct containing an array in Rust?

聲明包含數組的結構,然后創建零初始化實例的推薦方法是什么?

這是結構:

#[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

難道我做錯了什么?

Rust沒有為所有數組實現Default ,因為它沒有非類型多態。 因此, Default僅針對少數大小實現。

但是,您可以為您的類型實現默認值:

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

注意:我認為為u32實現Default是很可疑的; 為什么0而不是1 還是42 沒有好的答案,所以沒有明顯的默認。

我擔心你不能這樣做,你需要自己為你的結構實現Default

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

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

數字類型與此情況無關,更像是固定大小數組的問題。 他們仍然需要通用的數字文字來本地支持這種事情。

如果你確定用零初始化每個字段,這將起作用:

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

實際上,在撰寫本文時,標准庫中仍然支持對固定長度數組的支持:

https://github.com/rust-lang/rust/issues/7622

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM