gpt4 book ai didi

module - 是否有可能有一个模块可以在 crate 外部分访问,而部分只能在 crate 内访问?

转载 作者:行者123 更新时间:2023-11-29 08:07:45 24 4
gpt4 key购买 nike

有什么比将所有内容都放在同一个模块中更好的方法吗?

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 的字段必须是公开的。这两个选项都允许从我的 crate 外部进行访问。

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

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 .

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

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

关于module - 是否有可能有一个模块可以在 crate 外部分访问,而部分只能在 crate 内访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45313433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com