2

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

sub_module.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或所有字段GiantStruct都必须是公共的。这两个选项都允许从我的箱子外部访问。

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

sub_module.rs

pub struct GiantStruct { /* */ }

impl GiantStruct {
    // now you can't call this method without an appropriate
    // GiantStructBuilder
    pub fn new(&mut GiantStructBuilder) -> GiantStruct { /* */ };

    pub fn do_stuff( /* */ ) { /* */ };
}

然而,这似乎真的违反直觉,因为通常调用者是正在行动的东西,而函数变量是被行动的东西,这样做显然不是这种情况。所以我还是想知道有没有更好的方法...

4

1 回答 1

2

您可以使用新稳定的pub(restricted)隐私

这将允许您仅将类型/功能公开给有限的模块树,例如

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用来指定它只对父模块公开。

于 2017-07-26T09:56:58.950 回答