2014-12-01 13 views
7

Ho un piccolo progetto e voglio incapsulare i campi di una struct e usare metodi implementati.Struttura pubblica/privata 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() 
    } 
} 

che mi piacerebbe lasciare Prey come private.

main.rs

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

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

ottengo un errore:

error: struct `Prey` is private 

so che se ho messo pub prima struct Prey {}, vado a prendere il risultato atteso. Sarò grato per una spiegazione, come, perché no e/o le migliori pratiche.

risposta

8

La visibilità funziona a livello di modulo. Se si desidera che il modulo X abbia accesso a un item nel modulo Y, il modulo Y deve renderlo pubblico.

I moduli sono anche articoli. Se non rendi pubblico un modulo, allora è interno alla tua cassa. Pertanto, non dovresti preoccuparti di rendere pubblici gli oggetti in quel modulo; solo la tua cassa avrà accesso ad essa.

La radice cassa (di solito il file denominato lib.rs o main.rs) è il modulo principale della vostra cassa. Definisce l'interfaccia pubblica della cassa, cioè gli oggetti pubblici nella radice della cassa sono accessibili da altre casse.

Nel tuo esempio, scrivi mod prey;. Ciò definisce il modulo prey come privato, quindi gli elementi nel modulo prey non sono accessibili da altre casse (a meno che non li si riesegua con pub use). Ciò significa che devi rendere pubblico lo prey::cycle::Prey.

+0

l'ultimo paragrafo mette tutto nel posto giusto, grazie. –