2017-07-10 4 views
8

sagen, dass ich meine eigene Art in Rust Bibliothek definieren, etwa so:Deaktivieren Sie den Standardkonstruktor in 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 } 
    } 
} 

Gibt es eine Möglichkeit zu erfordern Benutzer das Date::new Konstruktor zu verwenden? Mit anderen Worten, können ihre eigenen Datum Struktur mit dem Standardkonstruktor irgendwie verbieten ich Benutzer zu schaffen, wie so:

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

Ich frage, weil es sich um eine schädliche Fehler zu sein scheint, wenn Sie nicht Entwickler zwingen kann, ihre Argumente durch ein laufen Batterie der Validierung vor dem Festlegen der Mitglieder einer Struktur. (Obwohl, vielleicht gibt es ein anderes Muster, das ich in Rust verwenden sollte, wie Daten zu validieren, wenn sie verwendet werden, anstatt wenn sie erstellt werden; fühlen Sie sich frei, das zu kommentieren.)

+3

Dies würde normalerweise nicht als "Standardkonstruktor" bezeichnet werden; das würde "Date :: default" (von der ['Default'-Eigenschaft] (https://doc.rust-lang.org/std/default/trait.Default.html)) bedeuten. Ich würde das wahrscheinlich nur "struct literal syntax" nennen. – Shepmaster

Antwort

9

TL; DR: Der "Standard Konstruktor "ist standardmäßig bereits deaktiviert.

Die struct Syntax ist nur für diejenigen, die Zugang zu allen die Felder der struct.

Daher ist es nur im selben Modul zugänglich, gemäß den Datenschutzregeln, es sei denn, alle Felder sind mit pub markiert. In diesem Fall ist es überall zugänglich, wo struct ist.

Beachten Sie, dass das gleiche gilt für Funktionen ist, da new nicht pub hier markiert ist, dann ist es nicht zugänglich jedem Modul andere als die aktuelle.

+0

Ah! Ausgezeichnet. Danke mein Herr! –

+0

@ JonathanWilbur: Sie sind herzlich willkommen :) –

+0

@ 8bittree: Nein, es ist ein außer. Lass mich das ein bisschen mehr qualifizieren. –

Verwandte Themen