我在我的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() {}
答案 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}}定义的模块之外不可见。