如果在Cargo包的src目录中有多个.rs文件,那么关于可见性、导入等方面有哪些规则呢?当前情况是:任何额外的.rs文件(即不是在Cargo.toml文件中明确标识为可执行文件源代码的文件)都会被忽略。如何解决这个问题呢?
这方面,Cargo 并没有什么特别的地方,它使用的是普通的 Rust 模块系统。如果 Cargo 编译 src/lib.rs
,那么与执行 rustc --crate-type lib src/lib.rs
几乎等价(实际上有更多的命令行参数,但这就是基本原理)。
其他文件则可以通过 mod
、use
等关键字使用。文件不会自动导入或者类似的操作。这部分还没有很清晰的文档说明,一些简要说明如何实现的内容可以在http://rustbyexample.com/mod/split.html 和 http://doc.rust-lang.org/reference.html#modules 中找到,但是任何非平凡代码库都将使用它们,因此您可以选择任何代码库进行查看来获取示例。
mod foo;
这看起来像是一个声明,但如果没有参数,它实际上类似于一个包含。因此,你可以使用相同的关键字用于声明和包含模块,即没有使用::关键字。
其次,模块本身可以是公共的或私有的。如果你在问题函数及包含模块上都没有添加pub关键字,那么可能会使你困扰。
pub mod foo {pub fn bar();}
第三,每个文件的顶部似乎都添加了一个隐式模块。这很令人困惑;参考手册谈到了文件路径和名称以及代码中的模块路径之间的严格分离,但是这里的抽象似乎有泄漏。
注意,Rust仍处于1.0之前(0.12),模块系统和文件路径相对较高级,因此如果您读到本文时我的说法已经过时,请不要感到惊讶。
文件会被隐式地包含在你的 Rust 代码中。
例如,如果在你的 Cargo.toml
文件的 [lib]
或 [[bin]]
部分中指向 path
的文件为 src/foo.rs
,那么该文件将被包含在其中:
mod bar;
它告诉cargo同时构建src/bar.rs
并将其包含。