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

Mas*_*Man 4 module rust

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

// main.rs

mod dog; // Find dog in dog.rs or dog/mod.rs
fn main() {
    dog::bark();
}
Run Code Online (Sandbox Code Playgroud)

dog变大并且具有许多功能时,将它们全部放在一个文件中并不好.

如何在不使用的情况下将它们分开

dog::leg::walk();
dog::head::nose::smell();
dog::tail::iron_tail();
dog::mouth::sonic_bark();
Run Code Online (Sandbox Code Playgroud)

我想要用 dog::sonic_bark();

She*_*ter 7

可能的,但你绝对不应该这样做,因为它不惯用,可能会破坏各种工具和 IDE,而且通常会令人困惑。除教育目的外,请不要阅读本文。

\n\n
\n\n

技巧是使用include!直接导入源代码。

\n\n

文件系统

\n\n
do-not-do-this\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dog-head.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dog-tail.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dog.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/main.rs

\n\n
mod dog;\n\nfn main() {\n    dog::bark();\n    dog::wag();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/dog.rs

\n\n
include!("dog-head.rs");\ninclude!("dog-tail.rs");\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/dog-head.rs

\n\n
pub fn bark() {\n    eprintln!("Woof");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/dog-tail.rs

\n\n
pub fn wag() {\n    eprintln!("Swish");\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Mat*_* M. 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;
Run Code Online (Sandbox Code Playgroud)

你也可以直接调用这些:dog::walk(),dog::smell(),...

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

  • 您也可以直接从模块重新导出所有公共项目:`pub use self::leg::*;` 等 (2认同)
  • 您能展示跨多个文件的示例解决方案吗?最初的问题是询问如何将模块拆分为多个文件,但本示例不清楚如何做到这一点。 (2认同)