Rust中的公共/私有结构

问题描述:

我有一个小项目,我想封装一个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,我会得到预期的结果。我将很感激解释,如何,为什么不是和/或最佳实践。

可见性在模块级别工作。如果您希望模块X有权访问模块Y中的item,则模块Y必须公开它。

模块也是项目。如果你不公开一个模块,那么它就是你的箱子的内部。因此,您不必担心公开该模块中的项目;只有你的箱子才能访问它。

的箱子根(通常命名为lib.rsmain.rs文件)是你的箱子的根模块。它定义了箱子的公共接口,即箱子根中的公共物品可以从其他箱子访问。

在你的例子中,你写mod prey;。这将prey模块定义为私有模块,因此prey模块中的项目不能从其他板条箱访问(除非您以pub use将其重新导出)。这意味着你应该公开prey::cycle::Prey

+0

最后一段把一切都放在正确的地方,谢谢。 – 2014-12-02 00:22:47