如何在Rust货运项目中使用另一个模块中的一个模块?

11 module rust

有很多关于使用模块的Rust 文档,但我还没有找到一个包含多个模块的Cargo二进制文件的示例,其中一个模块使用另一个模块.我的例子在src文件夹中有三个文件.模块a和b处于同一级别.一个不是另一个的子模块.

main.rs:

mod a;

fn main() {
    println!("Hello, world!");
    a::a();
}
Run Code Online (Sandbox Code Playgroud)

a.rs:

pub fn a() {
    println!("A");
    b::b();
}
Run Code Online (Sandbox Code Playgroud)

和b.rs:

pub fn b() {
    println!("B");
}
Run Code Online (Sandbox Code Playgroud)

我试过的变化use bmod b内部a.rs,但我不能得到这个代码进行编译.use b例如,如果我尝试使用,则会收到以下错误:

 --> src/a.rs:1:5
  |
1 | use b;
  |     ^ no `b` in the root. Did you mean to use `a`?
Run Code Online (Sandbox Code Playgroud)

让Rust认识到我想在货物应用程序中使用模块a中的模块b的正确方法是什么?

Mas*_*ara 16

你必须包括b.rs某个地方,通常是mod b;.如果ba(而不是兄弟姐妹a)的孩子,有两种方法可以做到这一点:

  • 推荐:重命名a.rsa/mod.rsb.rsa/b.rs.然后你就可以mod b;a/mod.rs.
  • 相反,您可以#[path = "b.rs"] mod b;a.rs不重命名源的情况下使用.

如果b打算成为a(而不是孩子a)的兄弟,你可以mod b;进入main.rs,然后use crate::b;进入a.rs.

  • 谢谢.这似乎违反直觉.我需要在`main.rs`中使用`mod b`以便在`a.rs`中使用b`. (8认同)
  • 这个想法是“mod”用于构建模块树,“use”用于短路它。绝对路径 `::b::b();` 无需使用 `use b;` 即可工作。(请注意,绝对路径的语法将在 Rust 的未来版本中发生变化,以支持 [RFC 2126](https://github.com/rust-lang/rfcs/blob/master/text/2126-path-clarity。医学博士)。) (2认同)

Vol*_*kyi 8

对于Rust版本1.33的同级方法,我无法接受。

取而代之的是,我使用了兄弟姐妹mod:

use crate::b;
Run Code Online (Sandbox Code Playgroud)

编辑:拼写错误的词条

  • 我想只有当你在 main.rs 文件中使用 mod b 包含 b 时,这才有效。 (5认同)
  • 能否结合上下文解释一下你的答案?我在遵循您的解决方案时遇到问题 (2认同)