有没有更好的方法,只是把所有东西都放在同一个模块中?
sub_module.rs
kCGMouseEventClickState
lib.rs
pub struct GiantStruct { /* */ }
impl GiantStruct {
// this method needs to be called from outside of the crate.
pub fn do_stuff( /* */ ) { /* */ };
}
问题在于pub mod sub_module;
use sub_module::GiantStruct;
pub struct GiantStructBuilder{ /* */ }
impl GiantStructBuilder{
pub fn new_giant_struct(&mut self) -> GiantStruct {
// Do stuff depending on the fields of the current
// GiantStructBuilder
}
}
;此方法应创建新的GiantStructBuilder::new_giant_struct()
但要执行此操作,您需要GiantStruct
内的pub fn new() -> GiantStruct
或sub_module.rs
的所有字段都必须公开。这两个选项都允许从我的箱子外面进行访问。
在写这个问题时,我意识到我可以这样做:
sub_module.rs
GiantStruct
然而,这似乎是违反直觉的,因为通常调用者是在函数变量被执行时起作用的东西,这显然不是这样做的情况。所以我仍然想知道是否有更好的方法......
答案 0 :(得分:2)
您可以使用新稳定的pub(restricted)
privacy。
这将允许您仅将类型/函数公开给有限的模块树,例如
pub struct GiantStruct { /* */ }
impl GiantStruct {
// Only visible to functions in the same crate
pub(crate) fn new() -> GiantStruct { /* */ };
// this method needs to be called from outside of the crate.
pub fn do_stuff( /* */ ) { /* */ };
}
或者您可以将其应用于GiantStruct
上的字段,以便您可以GiantStructBuilder
创建
pub struct GiantStruct {
pub(crate) my_field: u32,
}
您可以使用crate
来指定它仅对父模块公开,而不是super
。