2017-07-10 20 views
8

Say I zdefiniować własny typ w bibliotece rdza, tak:Wyłącz domyślny konstruktor w Rust?

struct Date { 
    year: u16, 
    month: u8, 
    day: u8 
} 

impl Date { 
    fn new(y: u16, m: u8, d: u8) -> Date { 
     // Do some validation here first 
     Date { year: y, month: m, day: d } 
    } 
} 

Czy istnieje sposób wymagają użytkownikom użyć konstruktora Date::new? Innymi słowy, czy mogę jakoś zabronić użytkownikom tworzenia własnych Data struct z domyślnego konstruktora tak:

let d = Date { 2017, 7, 10 }; 

Pytam, ponieważ wydaje się być szkodliwe wada, jeśli nie można zmusić deweloperów do uruchamiania swoich argumentów poprzez bateria sprawdzania poprawności przed ustawianiem członków struktury. (Chociaż może jest jakiś inny wzór, który powinienem zastosować w Rust, np. Sprawdzanie poprawności danych, gdy są one używane, a nie kiedy są tworzone, nie krępuj się komentować.)

+3

Normalnie nie będzie to nazywane "domyślnym konstruktorem"; oznaczałoby to "Date :: default" (z ['Default' trait] (https://doc.rust-lang.org/std/default/trait.Default.html)). Prawdopodobnie nazwałbym to "składnią literalną struktury". – Shepmaster

Odpowiedz

9

TL; DR: "domyślny konstruktor "jest już domyślnie wyłączony.

Składnia struct jest dostępna tylko dla tych, którzy mają dostęp do wszystkich polach struct.

W rezultacie jest dostępny tylko w tym samym module, zgodnie z zasadami prywatności, chyba że wszystkie pola są oznaczone jako pub. W takim przypadku jest dostępny wszędzie tam, gdzie jest struct.

Należy pamiętać, że tak samo jest z funkcji, ponieważ new nie zaznaczono pub tutaj, to niedostępne dla dowolnego modułu innego niż obecnie.

+0

Ah! Doskonały. Dziękuję Panu! –

+0

@ JonathanWilbur: Serdecznie zapraszamy :) –

+0

@ 8bittree: Nie, to jest chyba. Pozwól mi zakwalifikować to nieco więcej. –

Powiązane problemy