I am pretty new to Rust and I find the docs can be a little confusing sometimes so I'd be really thankful for people who can help me understand this.
So for my uni project we are doing part of it in Rust. and I am having issues understanding how the modules function. So here is my example program.
Main.rs does some stuff and then passes a pointer into a function from a separate Rust file. That function then does some more things and passes a new variable into a function form another separate Rust file as a pointer.
main.rs has mod separate_file1;
and then in separate_file 1 there is a mod separate_file2;
.
The confusion is that separate_file2 does not read from the same directory as main.rs despite being in it. Instead it looks in a sub-folder under the same name.
If someone could explain to me why it works like this and what the best practice is for using modules I would be really thankful. It's made me struggle a lot.
If you want your module to contain submodules, it needs to go into a folder. That folder needs to be named like the module.
It's explained pretty well in the book, imho: https://doc.rust-lang.org/stable/book/ch07-02-defining-modules-to-control-scope-and-privacy.html
So, for your example, the file structure could for instance be
src/main.rs
src/separate_file1.rs
src/separate_file1/separate_file2.rsAn alternative layout that I think is more common would be
src/main.rs
src/separate_file1/mod.rs
src/separate_file1/separate_file2.rsOr, if you think separate_file2 could contain submodules at some point, maybe
src/main.rs
src/separate_file1/mod.rs
src/separate_file1/separate_file2/mod.rsBest to not think of files as modules. Instead a rust crate is just a tree of modules with the
src/main.rs
orsrc/lib.rs
being the main entry point.Inside these files you define the module structure you want like:
mod foo { mod bar {} }
This creates two modules,
crate::foo
andcrate::foo::bar
. Now, because you don't want to have all your code in main.rs/lib.rs rust lets you move the module contents to separate files. But the location of the file needs to match its location in the module structure - from the crates root (not the file it was declared in).So when you call
mod foo;
fromsrc/main.rs
it will look forsrc/foo.rs
orsrc/foo/mod.rs
(and you can only have one of these). And thefoo::bar
- no matter if that is declared insrc/main.rs
(as above) or insidesrc/foo.rs
orsrc/foo/mod.rs
, it will always look for thebar
module contents insidesrc/foo/bar.rs
orsrc/foo/bar/mod.rs
as it is nested inside thefoo
module - not because the file is next to the current one.This means if you had this inside main.rs/lib.rs:
mod foo { mod bar { mod baz; } }
Then it will look for the
baz
module contents insidesrc/foo/bar/baz.rs
orsrc/foo/bar/baz/mod.rs
- even though those might be the only two files you have.What do you mean by "doesn't read from the same directory"? Is part of your application's function to read in data from files in your project's directory tree?
Without seeing the directory structure of your project, or some more actual code samples its hard to understand how to help 😅