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

Module 如何使用一个模块拥有多个文件?,module,rust,Module,Rust,我不明白为什么每个模块只有一个文件 // main.rs mod dog; // Find dog in dog.rs or dog/mod.rs fn main() { dog::sonic_bark(); } 当dog变得更大并且有很多功能时,将它们全部放在一个文件中是不好的 我怎么能不使用 dog::leg::walk(); dog::head::nose::smell(); dog::tail::iron_tail(); dog::mouth::sonic_bark();

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

// main.rs

mod dog; // Find dog in dog.rs or dog/mod.rs
fn main() {
    dog::sonic_bark();
}
dog
变得更大并且有很多功能时,将它们全部放在一个文件中是不好的

我怎么能不使用

dog::leg::walk();
dog::head::nose::smell();
dog::tail::iron_tail();
dog::mouth::sonic_bark();
我只想使用
dog::sonic_bark()

您不能

您可以拥有比文件更多的模块(典型的示例是嵌套在文件中的
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::嗅觉()

因此,私有导入和公共再导出有助于在公开平面公共接口的同时隐藏内部层次结构


完整示例:

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

    mod leg {
        pub fn walk() {}
    }

    mod head {
        pub mod nose {
            pub fn smell() {}
        }
    }

    mod tail {
        pub fn iron_tail() {}
    }

    mod mouth {
        pub fn sonic_bark() {}
    }
}

fn main() {
    dog::sonic_bark();
}
这是可能的,但您绝对不应该这样做,因为它是单一的,可能会破坏各种工具和IDE,并且通常会令人困惑。除非出于教育目的,请不要阅读此内容


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

文件系统

不要这样做
├── 货舱
├── src
│   ├── 狗头犬
│   ├── 狗尾草
│   ├── 狗粮
│   └── 梅因
src/main.rs

mod dog;

fn main() {
    dog::bark();
    dog::wag();
}
include!("dog-head.rs");
include!("dog-tail.rs");
pub fn bark() {
    eprintln!("Woof");
}
pub fn wag() {
    eprintln!("Swish");
}
src/dog.rs

mod dog;

fn main() {
    dog::bark();
    dog::wag();
}
include!("dog-head.rs");
include!("dog-tail.rs");
pub fn bark() {
    eprintln!("Woof");
}
pub fn wag() {
    eprintln!("Swish");
}
src/dog head.rs

mod dog;

fn main() {
    dog::bark();
    dog::wag();
}
include!("dog-head.rs");
include!("dog-tail.rs");
pub fn bark() {
    eprintln!("Woof");
}
pub fn wag() {
    eprintln!("Swish");
}
src/dog tail.rs

mod dog;

fn main() {
    dog::bark();
    dog::wag();
}
include!("dog-head.rs");
include!("dog-tail.rs");
pub fn bark() {
    eprintln!("Woof");
}
pub fn wag() {
    eprintln!("Swish");
}

这应该是struct,但我只是问一下模块。在哪里放置重新导出符号?我现在知道了。输入mod.rs。我刚刚研究过。你也可以直接从模块中重新导出所有公共项:
pub-use-self::leg::*ETC您可以跨多个文件显示示例解决方案吗?最初的问题是关于如何将模块分割成多个文件,本例不清楚如何做到这一点。