是否有可能有一个模块可以在板条箱外部分访问,而部分只能在板条箱内访问?
Is it possible to have a module which is partially accessible outside of a crate and partially only inside the crate?
有没有比将所有内容都放在同一个模块中更好的方法?
sub_module.rs
pub struct GiantStruct { /* */ }
impl GiantStruct {
// this method needs to be called from outside of the crate.
pub fn do_stuff( /* */ ) { /* */ };
}
lib.rs
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
,但为此您需要 sub_module.rs
内部的 pub fn new() -> GiantStruct
,或者 GiantStruct
的所有字段都必须是 public。这两个选项都允许从我的板条箱外部访问。
在写这个问题的时候,我意识到我可以这样做:
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( /* */ ) { /* */ };
}
然而,这似乎确实违反直觉,因为通常调用者是正在执行的操作,而函数变量是被操作的操作,但这样做显然不是这种情况。所以我还是想知道有没有更好的方法...
您可以使用新稳定的pub(restricted)
privacy。
这将允许您仅将 types/functions 公开给有限的模块树,例如
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,
}
您也可以使用 super
代替 crate
指定父模块仅 public。
有没有比将所有内容都放在同一个模块中更好的方法?
sub_module.rs
pub struct GiantStruct { /* */ }
impl GiantStruct {
// this method needs to be called from outside of the crate.
pub fn do_stuff( /* */ ) { /* */ };
}
lib.rs
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
,但为此您需要 sub_module.rs
内部的 pub fn new() -> GiantStruct
,或者 GiantStruct
的所有字段都必须是 public。这两个选项都允许从我的板条箱外部访问。
在写这个问题的时候,我意识到我可以这样做:
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( /* */ ) { /* */ };
}
然而,这似乎确实违反直觉,因为通常调用者是正在执行的操作,而函数变量是被操作的操作,但这样做显然不是这种情况。所以我还是想知道有没有更好的方法...
您可以使用新稳定的pub(restricted)
privacy。
这将允许您仅将 types/functions 公开给有限的模块树,例如
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,
}
您也可以使用 super
代替 crate
指定父模块仅 public。