多个 Rust 源文件的 cargo 项目

21
如果在Cargo包的src目录中有多个.rs文件,那么关于可见性、导入等方面有哪些规则呢?当前情况是:任何额外的.rs文件(即不是在Cargo.toml文件中明确标识为可执行文件源代码的文件)都会被忽略。如何解决这个问题呢?
3个回答

14

这方面,Cargo 并没有什么特别的地方,它使用的是普通的 Rust 模块系统。如果 Cargo 编译 src/lib.rs,那么与执行 rustc --crate-type lib src/lib.rs 几乎等价(实际上有更多的命令行参数,但这就是基本原理)。

其他文件则可以通过 moduse 等关键字使用。文件不会自动导入或者类似的操作。这部分还没有很清晰的文档说明,一些简要说明如何实现的内容可以在http://rustbyexample.com/mod/split.htmlhttp://doc.rust-lang.org/reference.html#modules 中找到,但是任何非平凡代码库都将使用它们,因此您可以选择任何代码库进行查看来获取示例。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Steve Klabnik

6
很难根据你提供的信息确定你遇到了什么问题。以下是我在阅读文档后依然需要参考的三个看似微不足道的细节:
首先,
    mod foo;

这看起来像是一个声明,但如果没有参数,它实际上类似于一个包含。因此,你可以使用相同的关键字用于声明和包含模块,即没有使用::关键字。

其次,模块本身可以是公共的或私有的。如果你在问题函数及包含模块上都没有添加pub关键字,那么可能会使你困扰。

    pub mod foo {pub fn bar();}

第三,每个文件的顶部似乎都添加了一个隐式模块。这很令人困惑;参考手册谈到了文件路径和名称以及代码中的模块路径之间的严格分离,但是这里的抽象似乎有泄漏。

注意,Rust仍处于1.0之前(0.12),模块系统和文件路径相对较高级,因此如果您读到本文时我的说法已经过时,请不要感到惊讶。


2

文件会被隐式地包含在你的 Rust 代码中。

例如,如果在你的 Cargo.toml 文件的 [lib][[bin]] 部分中指向 path 的文件为 src/foo.rs,那么该文件将被包含在其中:

mod bar;

它告诉cargo同时构建src/bar.rs并将其包含。


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