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

12

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

// 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();


这应该是结构体,但我只是询问模块相关的内容。 - Masked Man
2个回答

14

你不能。

模块的数量可以比文件多(典型的例子是在文件中嵌套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(), ...

因此,私有导入和公共重新导出帮助您拥有一个隐藏的内部层次结构,同时公开了一个平坦的公共接口。


完整示例:

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();
}

在哪里放置重新导出的符号? - Masked Man
我现在知道了。放在mod.rs文件中。我刚刚做了研究。 - Masked Man
3
你可以直接从一个模块重新导出所有公共项:pub use self::leg::*; 等等。 - Kroltan
4
你能展示一个跨多个文件的解决方案的例子吗?原始问题是关于如何将模块拆分到多个文件中,对于这个例子来说不太清楚如何实现。 - justin.m.chase

7
这是可能的,但你绝对不应该这样做,因为这不符合惯例,可能会破坏各种工具和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");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接