我遇到了一些问题reading the Rust documentation:
在此示例中,我们再次提供了三个模块:
的方法client
,network
和network::client
。按照我们之前为将模块提取到文件中所做的相同步骤,我们将为client
模块创建 src / client.rs 。对于network
模块,我们将创建 src / network.rs 。但是我们无法将network::client
模块解压缩到 src / client.rs 文件中,因为顶级client
模块已存在!如果我们可以将两个的代码放在 src / client.rs 文件中的client
和network::client
模块中,那么Rust就没有了了解代码是用于client
还是用于network::client
为什么Rust需要知道client.rs
中的代码属于client
或network::client
?它可以属于两者吗?
答案 0 :(得分:7)
编译器具有关于外部模块的源文件的位置的规则。这些规则确保没有两个模块使用相同的源文件。
如果您真的想要,可以使用#[path]
attribute覆盖规则:
mod client; // defaults to client.rs relative to the current file
mod network {
#[path="client.rs"] // reads the same source as the outer `mod client;`
mod client;
}
然而,这样做会导致代码重复,即client.rs
中的代码将被编译两次,client.rs
中定义的所有内容将在两个单独的模块中定义两次。就好像您将network/client.rs
作为client.rs
的精确副本,并且没有写出#[path]
属性。
您可以做的另一件事是通过在别处重新导出为模块提供别名。这在构建库时非常有用:它使您能够呈现与内部模块层次结构不同的外部模块层次结构。
mod client; // not accessible externally
pub mod network {
pub use client; // network::client::* will refer to the same definitions as client::*
}
例如,如上所述,client
模块在client.rs
中定义,但客户通过my_crate::network::client
使用它。