Reputation:
There's a lot of Rust documentation about using modules, but I haven't found an example of a Cargo binary that has multiple modules, with one module using another. My example has three files inside the src folder. Modules a and b are at the same level. One is not a submodule of another.
main.rs:
mod a;
fn main() {
println!("Hello, world!");
a::a();
}
a.rs:
pub fn a() {
println!("A");
b::b();
}
and b.rs:
pub fn b() {
println!("B");
}
I've tried variations of use b
and mod b
inside a.rs, but I cannot get this code to compile. If I try to use use b
, for example, I get the following error:
--> src/a.rs:1:5
|
1 | use b;
| ^ no `b` in the root. Did you mean to use `a`?
What's the right way to have Rust recognize that I want to use module b from module a inside a cargo app?
Upvotes: 46
Views: 22764
Reputation: 2784
In the latest Rust 1.63, we can use super keyword to refer siblings
// main.rs
mod a;
mod b;
fn main() {
}
// a.rs
pub fn a() {
println!("A");
super::b::b();
}
// b.rs
pub fn b() {
println!("B");
}
Upvotes: 4
Reputation: 427
The method from the accepted answer doesn't work for me in Rust 1.33. Instead, I use the sibling module like this:
use crate::b;
Upvotes: 26
Reputation: 3545
You'll have to include b.rs
somewhere, typically with mod b;
. If b
is a child of a
(instead of being a sibling of a
), there are two ways to do this:
a.rs
into a/mod.rs
and b.rs
into a/b.rs
. Then you can mod b;
in a/mod.rs
.#[path = "b.rs"] mod b;
in a.rs
without renaming sources.If b
is intended to be a sibling of a
(instead of being a child of a
), you can just mod b;
in main.rs
and then use crate::b;
in a.rs
.
Upvotes: 52