避免使用 Rust 中的 pub
Avoiding pubs in Rust
我刚刚将我的程序拆分为一个可执行文件和一个充满结构定义的大文件 (structs.rs)。
为了在主要可执行文件中使用结构及其字段,我必须在每个结构定义和每个字段定义前加上pub
。
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Foo {
pub bar: u8,
pub baz: [u8; 4]
}
这会降低可读性。
有没有办法避免所有这些酒吧?
或者我应该使用另一种方法将我的程序分解成多个文件吗?
这是意料之中的。模块和 crates 是 Rust 中的隐私边界。结构体及其字段的默认隐私级别是“同一模块及其子模块”,因此父模块和兄弟模块需要有访问结构体字段的权限。
在 Rust 结构中,通常只有几个字段,但这些字段可能有重要的不变量需要维护。例如,如果 Vec.len
是 public,您可能会导致不安全的越界访问。作为预防措施,Rust 要求程序员仔细考虑他们是否可以允许访问每个字段。
拥有数千个结构或具有数千个字段的结构是不寻常的,除非它们正在镜像某些外部数据定义。如果是这种情况,请考虑使用宏或 build.rs
.
自动生成结构定义
我刚刚将我的程序拆分为一个可执行文件和一个充满结构定义的大文件 (structs.rs)。
为了在主要可执行文件中使用结构及其字段,我必须在每个结构定义和每个字段定义前加上pub
。
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Foo {
pub bar: u8,
pub baz: [u8; 4]
}
这会降低可读性。
有没有办法避免所有这些酒吧?
或者我应该使用另一种方法将我的程序分解成多个文件吗?
这是意料之中的。模块和 crates 是 Rust 中的隐私边界。结构体及其字段的默认隐私级别是“同一模块及其子模块”,因此父模块和兄弟模块需要有访问结构体字段的权限。
在 Rust 结构中,通常只有几个字段,但这些字段可能有重要的不变量需要维护。例如,如果 Vec.len
是 public,您可能会导致不安全的越界访问。作为预防措施,Rust 要求程序员仔细考虑他们是否可以允许访问每个字段。
拥有数千个结构或具有数千个字段的结构是不寻常的,除非它们正在镜像某些外部数据定义。如果是这种情况,请考虑使用宏或 build.rs
.