2017-07-01 3 views
7

Ich versuche, Primzahlen zu generieren. Der Code muss alle generierten Primzahlen speichern (um den nächsten erzeugen zu können), um einige private Funktionen zu unterstützen und eine öffentliche Funktion (generate_next_prime).Ist es möglich eine private Variable in Rust zu erstellen?

In Java oder C++ würde ich eine PrimesGen Klasse schreiben, aber in Rust kann es private Variablen in einer Struktur nicht geben. In Python würde ich wahrscheinlich ein PrimesGen Modul schreiben, aber in Rust können Module keine Variablen haben.

Dieser Code kompiliert und läuft:

struct PrimesGen { 
    primes_so_far: Vec<i32>, 
    next_candidate: i32, 
} 

impl PrimesGen { 
    pub fn new() -> PrimesGen { 
     PrimesGen { 
      primes_so_far: vec![], 
      next_candidate: 2, 
     } 
    } 
} 

fn main() { 
    let pg: PrimesGen = PrimesGen::new(); 
    println!("{}", pg.next_candidate); 
} 

Also, was soll ich tun?

+1

Felder in einer Struktur sind standardmäßig privat. –

+0

@ FrancisGagné Ich habe meinen Code hinzugefügt, was mache ich falsch? – Neo

+0

Sie befinden sich in der gleichen Datei, die 'PrimesGen' definiert hat, so dass Sie damit machen können, was Sie wollen, da Sie es besitzen. – loganfsmyth

Antwort

9

In Rust ist eine Datei implizit ein Modul. Wenn Sie Code in eine foo.rs-Datei einfügen, müssen Sie mod foo; eingeben, da der Name dieser Datei implizit der Name des Moduls ist. Die Datei mit dem Haupt ist keine Ausnahme: Es ist ein Modul (das Basismodul).

Jetzt, in einem Modul, kann alles auf alles zugreifen. Sehen Sie dieses kleine Beispiel davon überzeugt werden:

struct Foo { 
    x: i32, // private 
} 

struct Bar {} 

impl Bar { 
    fn foo(f: Foo) { 
     let _ = f.x; 
    } 
} 

fn main() { 
    let f = Foo { x: 42 }; 
    Bar::foo(f); 
} 

Bar die privaten Mitglieder Foo zugreifen können: in Rust, die Sichtbarkeit durch das Modul funktioniert und nicht struct. Innerhalb desselben Moduls können Sie nicht etwas Privates für dasselbe Modul tun.

Also, wenn Sie die Variable privat in Ihrem Beispiel machen wollen, setzen Sie Ihre Struktur und Implementierung innerhalb eines Moduls:

mod prime { 
    pub struct PrimesGen { 
     primes_so_far: Vec<i32>, 
     next_candidate: i32, 
    } 

    impl PrimesGen { 
     pub fn new() -> PrimesGen { 
      PrimesGen { 
       primes_so_far: vec![], 
       next_candidate: 2, 
      } 
     } 
    } 
} 

fn main() { 
    use prime::*; 

    let pg: PrimesGen = PrimesGen::new(); 
    println!("{}", pg.next_candidate); // error: field is private 
} 
+1

Also die Antwort ist, keine großen Dateien zu haben. Niedlich. – Squirrel

+2

@Squirrel Nicht sicher, wie ich Ihren Kommentar interpretieren muss. Sie müssen * keine * kleinen Module verwenden (ich glaube, Sie wollten "Modul" schreiben), aber es ist in der Tat eine sehr gute Übung, die Module einfach zu halten. – Boiethios

Verwandte Themen