2014-12-01 12 views
7

Ich habe ein kleines Projekt, und ich möchte die Felder einer Struktur kapseln und implementierte Methoden verwenden.Öffentlich/Private Struktur in Rust

├── src 
├── main.rs 
├── predator 
└── prey 
    ├── cycle.rs 
    └── mod.rs 

cycle.rs

struct Prey { 
    name: String, 
} 

impl Prey { 
    pub fn new(n: String) -> Prey { 
     Prey { name: n } 
    } 

    pub fn get_name(&self) -> &str { 
     self.name.as_str() 
    } 
} 

Ich mag würde Prey als privat verlassen.

main.rs

use prey::cycle::Prey; 
mod prey; 

fn main() { 
    let pr = Prey::new("Hamster".to_string()); 
    println!("Hello, world! {}", pr.get_name()); 
} 

Ich erhalte eine Fehlermeldung:

error: struct `Prey` is private 

Ich weiß, dass, wenn ich pub vor struct Prey {} setzen, ich werde das erwartete Ergebnis. Ich werde dankbar sein für eine Erklärung, wie, warum nicht und/oder Best Practices.

Antwort

8

Die Sichtbarkeit funktioniert auf Modulebene. Wenn Modul X in Modul Y auf item zugreifen soll, muss es von Modul Y öffentlich gemacht werden.

Module sind auch Elemente. Wenn du ein Modul nicht öffentlich zugänglich machst, dann ist es intern in deiner Kiste. Daher sollten Sie sich nicht darum kümmern, dass Elemente in diesem Modul veröffentlicht werden. nur Ihre Kiste wird Zugang haben.

Die Kiste Wurzel (in der Regel der Datei mit dem Namen lib.rs oder main.rs) das Root-Modul Ihrer Kiste ist. Sie definiert die öffentliche Schnittstelle der Kiste, d. H. Öffentliche Gegenstände in der Kistenwurzel sind von anderen Kisten aus zugänglich.

In Ihrem Beispiel schreiben Sie mod prey;. Dies definiert das prey Modul als privat, so dass Elemente im Modul prey nicht von anderen Kisten aus zugänglich sind (es sei denn, Sie exportieren sie erneut mit pub use). Das bedeutet, dass Sie prey::cycle::Prey veröffentlichen sollten.

+0

der letzte Absatz legte alles auf den richtigen Platz, danke. –