是否有可能在板条箱外面部分可以进入的模块,部分仅在板条箱内?

时间:2017-07-25 21:04:26

标签: module rust public rust-crates

有没有更好的方法,只是把所有东西都放在同一个模块中?

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() -> GiantStructsub_module.rs的所有字段都必须公开。这两个选项都允许从我的箱子外面进行访问。

在写这个问题时,我意识到我可以这样做:

sub_module.rs

GiantStruct

然而,这似乎是违反直觉的,因为通常调用者是在函数变量被执行时起作用的东西,这显然不是这样做的情况。所以我仍然想知道是否有更好的方法......

1 个答案:

答案 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