2014-12-01 17 views
7

Mam mały projekt i chcę enkapsulować pola struct i korzystać z zaimplementowanych metod.Struktura publiczna/prywatna w 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() 
    } 
} 

które chciałbym zostawić Prey jako prywatne.

main.rs

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

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

pojawia się błąd:

error: struct `Prey` is private 

wiem, że jeśli mogę umieścić pub przed struct Prey {}, będę uzyskać oczekiwany rezultat. Będę wdzięczny za wyjaśnienie, jak, dlaczego nie i/lub najlepsze praktyki.

Odpowiedz

8

Widoczność działa na poziomie modułu. Jeśli chcesz, aby moduł X miał dostęp do item w module Y, moduł Y musi upublicznić go.

Moduły też są przedmiotami. Jeśli nie uczynisz modułu publicznym, to jest on wewnętrzny dla twojej skrzynki. Dlatego nie powinieneś się martwić o publikowanie elementów w tym module; tylko twoja skrzynka będzie miała do niego dostęp.

Korzeń paka (zazwyczaj plik o nazwie lib.rs lub main.rs) jest moduł korzeń swojej skrzyni. Określa publiczny interfejs skrzynki, tj. Artykuły publiczne w korzeniu skrzynki są dostępne z innych skrzynek.

W twoim przykładzie piszesz mod prey;. To definiuje moduł prey jako prywatny, więc elementy z modułu prey nie są dostępne z innych skrzynek (chyba że ponownie wyeksportujesz je za pomocą pub use). Oznacza to, że powinieneś publicznie udostępnić prey::cycle::Prey.

+0

ostatni paragraf umieścić wszystko na właściwym miejscu, dzięki. –