如何使用一个模块拥有多个文件?

时间:2017-02-14 07:38:54

标签: module rust

我不明白为什么每个模块只有一个文件。

// main.rs

mod dog; // Find dog in dog.rs or dog/mod.rs
fn main() {
    dog::bark();
}

dog变得越来越大并且功能越来越多时,将所有这些功能放在一个文件中并不好。

如何在不使用

的情况下将它们分开
dog::leg::walk();
dog::head::nose::smell();
dog::tail::iron_tail();
dog::mouth::sonic_bark();

我想使用dog::sonic_bark();

2 个答案:

答案 0 :(得分:6)

你不能。

你可以拥有更多模块而不是文件(典型的例子是mod tests嵌套在文件中),但不是相反的。

但是,这并不重要,因为您可以使用封装+重新导出。

使用mod xxx;声明子模块时的默认值是xxx 私有:当前模块的任何用户都不知道它取决于xxx

将此与选择重新导出符号相结合:

pub use self::leg::walk;
pub use self::head::nose::smell;
pub use self::tail::iron_tail;
pub use self::mouth::sonic_bark;

您可以直接致电:dog::walk()dog::smell(),...

因此,私有导入和公共重新导出可帮助您在公开平面公共界面时拥有隐藏内部层次结构。

答案 1 :(得分:0)

这是有可能的,但是您应该绝对不要这样做,因为它是单一的,可能会破坏各种工具和IDE,并且通常会令人困惑。除非出于教育目的,否则请勿阅读此书。


诀窍是使用include!直接导入源代码。

文件系统

do-not-do-this
├── Cargo.toml
├── src
│   ├── dog-head.rs
│   ├── dog-tail.rs
│   ├── dog.rs
│   └── main.rs

src / main.rs

mod dog;

fn main() {
    dog::bark();
    dog::wag();
}

src / dog.rs

include!("dog-head.rs");
include!("dog-tail.rs");

src / dog-head.rs

pub fn bark() {
    eprintln!("Woof");
}

src / dog-tail.rs

pub fn wag() {
    eprintln!("Swish");
}