2014-11-21 433 views
6

推荐的方法是声明一个包含数组的结构,然后创建一个零初始化的实例?如何在Rust中初始化一个包含数组的结构?

这里的结构:

use std::default::Default; 
use std::num; 

#[deriving(Default)] 
struct Histogram { 
    sum: u32, 
    bins: [u32, ..256], 
} 

和编译器错误:

src/lib.rs:17:5: 17:23 error: the trait `core::default::Default` is not implemented for the type `[u32, ..256]` 
src/lib.rs:17  bins: [u32, ..256], 
        ^~~~~~~~~~~~~~~~~~ 
note: in expansion of #[deriving] 
src/lib.rs:14:1: 14:21 note: expansion site 
src/lib.rs:17:5: 17:23 note: the trait `core::default::Default` must be implemented because it is required by `core::default::Default::default` 
src/lib.rs:17  bins: [u32, ..256], 
        ^~~~~~~~~~~~~~~~~~ 
note: in expansion of #[deriving] 
src/lib.rs:14:1: 14:21 note: expansion site 
error: aborting due to previous error 

如果我尝试添加缺少的初始化为UINT8数组:

impl Default for [u32,..256] { 
    fn default() -> [u32,..255]{ 
     [0u8,..256] 
    } 
} 

我得到:

src/lib.rs:20:1: 24:2 error: cannot provide an extension implementation where both trait and type are not defined in this crate [E0117] 
src/lib.rs:20 impl Default for [u32,..256] { 
src/lib.rs:21  fn default() -> [u32,..255]{ 
src/lib.rs:22   [0u8,..256] 
src/lib.rs:23  } 
src/lib.rs:24 } 

我是否做错了什么,或者我是否在1.0版本的道路上被数字类型的标准库中的流失所困扰?

$ rustc --version 
rustc 0.13.0-nightly 

回答

3

锈没有实现Default所有的阵列,因为它不具有无型的多态性,因此Default仅用于尺寸极少数实现的。

你可以,但是,实现一个默认类型:

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

注:我主张实施Defaultu32是腥下手,为什么0而不是1?或42?没有好的答案,所以没有明显的默认值。

+0

我只有在默认情况下,因为零标记为标准库中已弃用。在没有〜零特征的情况下,我认为固定大小的数组比其他任何数据更有可能用于矢量 - 矢量加法,并且零矢量是用于加法的恒等向量,并且是默认的更自然的选择。但是,这是一些严重的自行车,我们在这里:) – 2014-11-21 18:10:42

3

恐怕你不能做到这一点,你将需要实现Default您自己的结构:

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

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

数值类型无关与这种情况下,它更像是有固定的问题大小的数组。他们仍然需要通用数字文字来原生支持这类事物。

+0

谢谢弗拉基米尔! Matthieu更快地给出了相同的答案,但是你的内联。如果可以的话,我会接受! – 2014-11-21 14:07:19

+0

是的,我只是在其他答案出现的时候按下提交按钮:)没关系,一切都很公平:) – 2014-11-21 14:09:13

2

如果你一定要各个领域初始化为零,这将工作:

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