我在 crate root 中定义了一个父结构,它返回一个在模块中定义的结构。我希望我的父结构是唯一能够构建子结构的东西,但是我天真的尝试很快就遇到了可以理解的隐私和可见性问题:
#![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() {}
最佳答案
首先,你的Child
struct 必须是公共(public)的,如果它是由 Parent
的方法返回的.因此你需要一个
pub use child::Child;
此外,这将意味着 Child
的实现也将公开,包括 new()
方法。为防止这种情况,您可以将其移至外部辅助方法,您将不重新导出。
另外,Child
如果您不想使用 Child(42)
构建结构,则它应该至少有一个私有(private)字段。语法。
最后,你有这样的东西:
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
定义的模块之外是不可见的.
关于rust - 如何隐藏子模块中的方法但仍可从父模块中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687122/