为什么Rust需要知道模块中的代码属于谁?

时间:2018-02-11 01:52:25

标签: rust

我遇到了一些问题reading the Rust documentation

  

在此示例中,我们再次提供了三个模块:clientnetworknetwork::client。按照我们之前为将模块提取到文件中所做的相同步骤,我们将为client模块创建 src / client.rs 。对于network模块,我们将创建 src / network.rs 。但是我们无法将network::client模块解压缩到 src / client.rs 文件中,因为顶级client模块已存在!如果我们可以将两个的代码放在 src / client.rs 文件中的clientnetwork::client模块中,那么Rust就没有了了解代码是用于client还是用于network::client

的方法

为什么Rust需要知道client.rs中的代码属于clientnetwork::client?它可以属于两者吗?

1 个答案:

答案 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使用它。