我不明白为什么每个模块只有一个文件.
// 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();
这是可能的,但你绝对不应该这样做,因为它不惯用,可能会破坏各种工具和 IDE,而且通常会令人困惑。除教育目的外,请不要阅读本文。
\n\n技巧是使用include!直接导入源代码。
文件系统
\n\ndo-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\nRun Code Online (Sandbox Code Playgroud)\n\nsrc/main.rs
\n\nmod dog;\n\nfn main() {\n dog::bark();\n dog::wag();\n}\nRun Code Online (Sandbox Code Playgroud)\n\nsrc/dog.rs
\n\ninclude!("dog-head.rs");\ninclude!("dog-tail.rs");\nRun Code Online (Sandbox Code Playgroud)\n\nsrc/dog-head.rs
\n\npub fn bark() {\n eprintln!("Woof");\n}\nRun Code Online (Sandbox Code Playgroud)\n\nsrc/dog-tail.rs
\n\npub fn wag() {\n eprintln!("Swish");\n}\nRun Code Online (Sandbox Code Playgroud)\n
你不能.
您可以拥有比文件更多的模块(典型示例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(),...
因此,私有导入和公共重新导出可以帮助您在公开平面公共接口时拥有隐藏的内部层次结构.