2014-11-21 22 views
6

Jaki jest zalecany sposób deklarowania struktury zawierającej tablicę, a następnie utworzenia instancji inicjowanej zerowo?Jak zainicjować strukturę zawierającą tablicę w Rust?

Oto struct:

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

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

a błąd kompilatora:

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 

Jeśli próbuję dodać brakujące inicjator na tablicy uint8:

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

otrzymuję :

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 } 

Czy robię coś nie tak, czy też jestem ukąszony przez odejście w standardowej bibliotece dla typów liczbowych na drodze do 1.0?

$ rustc --version 
rustc 0.13.0-nightly 

Odpowiedz

3

Rust nie implementuje Default dla wszystkich tablic, ponieważ nie ma polimorfizm typu non jako takie Default jest wykonalne tylko dla garstki rozmiarach.

Można jednak wdrożyć domyślne dla typu:

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

Uwaga: Chciałbym twierdzą, że wdrożenie Default dla u32 jest podejrzany na początek, dlaczego 0 i nie 1? lub 42? Nie ma dobrej odpowiedzi, więc nie ma oczywistych wątpliwości.

+0

Mam tylko ustawienie domyślne, ponieważ zero jest oznaczone jako przestarzałe w standardowej bibliotece. W przypadku braku cechy zerowej argumentowałbym, że macierze o stałych rozmiarach są częściej używane w wektorach wektorowych niż cokolwiek innego, a wektor zerowy jest wektorem tożsamości dla dodawania i jest bardziej naturalnym wyborem dla domyślnych . Ale to jest poważny motocykl, który tutaj robimy :) –

3

Obawiam się, że nie może tego zrobić, trzeba będzie wdrożyć Default dla swojej strukturze siebie:

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

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

typy numeryczne mają nic wspólnego z tą sprawą, to nic więcej jak problemy ze stałym -rozmiarowe tablice. Nadal potrzebują ogólnych literałów liczbowych, aby natywnie wspierać ten rodzaj rzeczy.

+0

Dzięki Vladimir! Matthieu dał tę samą odpowiedź szybciej, ale twoja ma wbudowany. Zaakceptowałbym oba, gdybym mógł! –

+0

Tak, przycisnąłem przycisk "prześlij" właśnie w momencie pojawienia się drugiej odpowiedzi :) W porządku, wszystko jest w porządku :) –

2

Jeśli masz pewność, aby zainicjować każde pole z zerem, zadziała:

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