mod some_mod;
Simply means "there exists some file called some_mod.rs
in this directory, or there exists some directory called some_mod
in this directory that contains a file called mod.rs
. Typing this line will make whatever content contained within the file (some_mod/mod.rs
or some_mod.rs
) available in this file via some_mod::whatever
.
So Rust source files are modules. There is also a handy inline syntax for defining a short sub-module in the current file/module without needing to have a separate file for this module. This syntax is the source of confusion for a lot of people as it makes them think they have to write mod some_mod {
to define any modules. Nope, this is just an inline shortcut for making a separate file and putting stuff in there, like the following:
mod some_other_mod {
// stuff in here
}
The above simply creates a module called some_other_mod
within the current module with the specified contents. This again is just a shortcut for making a file in the same directory called some_other_mod.rs
with the contents // stuff in here
and declaring it by writing mod some_other_mod
. You can also nest these.
Other than your crate's root lib.rs
or main.rs
file, every rust source file must have exactly one module declaration (a mod some_module;
statement) somewhere in the source code that lets cargo know that this file exists. If you simply want to bring a module into scope, you can do a use statement, like the following:
use some_mod;
Another caveat is when you are already in a submodule, any mod whatever;
statements inside of there will expect whatever.rs
to exist in my_sub_mod/whatever.rs
, NOT in the current directory.
You can also do pub mod some_mod;
. This will make the module available to parent modules and other crates.
You can also take a private module (declared via mod some_mod;
) and publicly re-export it (possibly with a different name) like so:
pub use some::private::module as cool_name;
pub use some::other::private_thing;
That's really all there is to modules.