20

如果我在一个 Cargo 包.rs的目录中有多个文件src,那么可见性、导入等规则是什么?

目前,任何额外的(即不是在 Cargo.toml 中明确标识为可执行文件的源的文件)文件都将被忽略。

我需要做什么来解决这个问题?

4

3 回答 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有几件事简要说明了如何实现,但任何非平凡的代码base 将使用它们,因此您可以选择几乎任何代码库来查看示例。

于 2014-10-22T12:23:44.310 回答
5

很难从你分享的信息中说出你被什么绊倒了。以下是三个看似微不足道的事情,我仍然必须参考文档才能弄清楚:

首先,

    mod foo;

看起来像一个声明,但它没有参数它实际上类似于一个包含。因此,您在声明和包含模块时使用相同的关键字,即没有 using:: 关键字。

其次,模块本身可以是公共的或私有的。如果您没有在相关函数和包含模块上都添加 pub 关键字,那可能会绊倒您。

    pub mod foo {pub fn bar();}

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

请注意,在撰写本文时,Rust 仍然是 pre-1.0 (0.12),在模块系统和文件路径方面相对较高,所以如果您阅读本文时我所说的可能已经错了,请不要感到惊讶。

于 2014-11-14T16:51:07.727 回答
1

文件隐含在您的 rust 代码中。

例如,如果您的 a or部分中src/foo.rs指向的文件包含:path[lib][[bin]]Cargo.toml

mod bar;

它也告诉cargo构建src/bar.rs,并包含它。

于 2022-01-27T10:09:27.287 回答