2014-12-01 95 views
7

我有一個小項目,我想封裝一個struct的字段並使用實現的方法。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() 
    } 
} 

我想離開Prey爲私人。

main.rs

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

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

我得到一個錯誤:

error: struct `Prey` is private 

我知道,如果我struct Prey {}之前把pub,我會得到預期的結果。我將很感激解釋,如何,爲什麼不是和/或最佳實踐。

回答

8

可見性在模塊級別工作。如果您希望模塊X有權訪問模塊Y中的item,則模塊Y必須公開它。

模塊也是項目。如果你不公開一個模塊,那麼它就是你的箱子的內部。因此,您不必擔心公開該模塊中的項目;只有你的箱子才能訪問它。

的箱子根(通常命名爲lib.rsmain.rs文件)是你的箱子的根模塊。它定義了箱子的公共接口,即箱子根中的公共物品可以從其他箱子訪問。

在你的例子中,你寫mod prey;。這將prey模塊定義爲私有模塊,因此prey模塊中的項目不能從其他板條箱訪問(除非您以pub use將其重新導出)。這意味着你應該公開prey::cycle::Prey

+0

最後一段把一切都放在正確的地方,謝謝。 – 2014-12-02 00:22:47