如何在子模块中隐藏方法但仍在父模块中使用它?

时间:2015-02-24 02:16:01

标签: rust

我在我的crate根目录中定义了一个父结构,它返回一个在模块中定义的结构。我希望我的父结构是唯一能够构建子结构的东西,但是我的天真尝试很快就会遇到可理解的隐私和可见性问题:

#![feature(unsafe_destructor)]

mod child {
    pub struct Child(u8);

    impl Child {
        fn new(v: u8) -> Child { Child(v) }
    }
}

struct Parent;

impl Parent {
    fn child(&self) -> child::Child {
        child::Child::new(42)
    }
}

fn main() {}

1 个答案:

答案 0 :(得分:5)

首先,如果Child结构由Parent的方法返回,则pub use child::Child; 结构必须是公共的。因此你需要一个

Child

此外,这意味着new()的实施也将公开,包括Child方法。为防止这种情况发生,您可以将其移至外部辅助方法,即重新导出。

此外,Child(42)结构应至少有一个私有字段,如果您不希望它使用pub use child::Child; mod child { pub struct Child { v: u8 } pub fn build_child(v: u8) -> Child { Child { v: v } } impl Child { fn val(&self) -> u8 { self.v } } } struct Parent; impl Parent { fn child(&self) -> Child { child::build_child(42) } } 语法构建。

最后,你有类似的东西:

child::build_child(..)

此处,Child是唯一能够创建Parent实例的方法,并且在包含{{1}}定义的模块之外不可见。