2014-11-21 4 views
6

Wie wird empfohlen, eine Struktur zu deklarieren, die ein Array enthält, und dann eine nullinitialisierte Instanz zu erstellen? HierWie initialisiert man eine Struktur, die ein Array in Rust enthält?

ist die Struktur:

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

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

und der Compiler-Fehler:

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 

Wenn ich die fehlende Initialisierung für die uint8 Array hinzuzufügen versuchen:

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

ich :

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 } 

Mache ich etwas falsch, oder werde ich von Abwanderung in der Standardbibliothek für numerische Typen auf dem Weg zu 1.0 gebissen?

$ rustc --version 
rustc 0.13.0-nightly 

Antwort

3

Rust nicht implementiert Default für alle Arrays, weil es nicht nicht-Typ Polymorphismus hat, als solche Default nur implementierbar für eine Handvoll Größen ist.

können Sie implementieren jedoch ein Standard für Ihre Art:

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

Hinweis: Ich würde behaupten, dass implementieren Default für u32 fischig ist mit zu beginnen, warum 0 und nicht 1? oder 42? Es gibt keine gute Antwort, also keine offensichtliche Vorgabe.

+0

Ich bekam nur auf Standard, weil Zero in der Standardbibliothek als veraltet gekennzeichnet ist. In Ermangelung eines ~ Null-Merkmals würde ich argumentieren, dass Arrays mit fester Größe eher in der Vektorvektoraddition verwendet werden als alles andere, und der Nullvektor ist der Identitätsvektor für die Addition und ist eine natürlichere Wahl für den Standard . Aber das ist etwas ernstes Bikeshedding, das wir hier machen :) –

3

Ich fürchte, Sie dies nicht tun können, müssen Sie Default für Ihre Struktur selbst implementieren:

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

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

Numerische Typen haben nichts mit diesem Fall zu tun, es mit festen mehr wie Probleme ist -Größe Arrays. Sie benötigen immer noch generische numerische Literale, um diese Art von Dingen nativ zu unterstützen.

+0

Danke Vladimir! Matthieu gab die gleiche Antwort schneller, aber deine hat die Inline. Ich würde beides akzeptieren, wenn ich könnte! –

+0

Yeah, ich habe den Submit-Button gedrückt, gerade als die andere Antwort auftauchte :) Das ist ok, alles ist fair :) –

2

Wenn Sie sicher sind, dass jedes Feld mit Null, dies zu initialisieren würde funktionieren:

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