The Detroit Post
Tuesday, 19 October, 2021

Rust Module

author
Paul Gonzalez
• Tuesday, 05 January, 2021
• 9 min read

Declaring a named type with the same name as a module in scope is forbidden: that is, a type definition, trait, struct, enumeration, union, type parameter or crate can't shadow the name of a module in scope, or vice versa. This allows macros to consume the syntax and make use of the unsafe keyword, before removing it from the token stream.

nu fume hood nuaire airflow laminar vertical laboratory equipment
(Source: www.nuaire.com)

Contents

The above example can alternately be expressed with crate::util's contents in a file named until/mod.rs. Note : Previous to rust 1.30, using mod.rs files was the way to load a module with nested children.

Paths for path attributes inside inline module blocks in a mod-rs file are relative to the directory of the mod-rs file including the inline module components as directories. For non-mod-rs files, it is the same except the path starts with a directory with the name of the non-mod-rs module.

For example, the following code snippet would use the paths shown based on where it is located: Modules, like all items, accept outer attributes.

They also accept inner attributes: either after {for a module with a body, or at the beginning of the source file, after the optional BOM and shebang. Photo by Randy Faith on Unsplash When beginning with Rust and having the need to expand to other files in subfolders of the project, one can stumble over the module concept of Rust very fast.

Whatever technology or programming language we use, we tend to structure our ideas and concepts in directories and files, in order to maintain a valuable overview as the project accelerates and expands, to encapsulate knowledge, and to create strong coherence. Creating these folders in a Rust project, it strikes home fast: Things are very different here.

kato unitrack track layouts layout adventures trak plans rmweb trains backscene oval rough drop train mats scenes
(Source: www.rmweb.co.uk)

A C-based language programmer tends to import files to get the respective types or namespaces within one’s scope. Playing around with some context help of the IDE or searching the internet, we learn that Rust thinks in modules, not files.

Important concepts in the Multimodule System are packages, crates, modules, and paths. This article focuses on modules and paths, when defined in multiple files and how to bring the split parts together.

By contract, main.rs or lib.rs act as the entry point into a package for the Rust compiler rust. We can, of course, build and run the project, as should be expected of a raw template.

We can set up our base camp right here and talk about how to climb that mountain. Our construction site (project) has dependencies between the street and its buildings, the power plant, generating power, and the tower building consuming it.

The project’s src folder structure Of course, we have to also write some code to glue together the mere file system items. Rust relies on a module tree in order to resolve all parts necessary to build.

fuel pump removal chevy install re impala tank ss continued assembly engine dropping without
(Source: www.impalassforum.com)

Note: You tell Rust to make a module, function, or symbol visible with the keyword pub. The glue for auxiliary_building A double colon separates parts of a path .

A path can be considered similar to resolving resources by namespaces and type names. The crate root, src/main.rs, will access the tower_building module through mod and use keywords.

The project structure after adding a plug folder and leaving created the file system part, we have to add some glue for the module system. As the submodule plug is added beneath the auxiliary_building module, we have to adjust the src/auxiliary_building.rs file accordingly.

We used them already: Rust ’s paths did do their job already, in that our crate root was able to call functionality, which was made available in our modules. They always start from the perspective of the crate root, exactly where our module tree has its origin.

In order to navigate up one level in the tree, like in the case of a file system, we use super. To summarize, there are three literals to start a path: crate (absolute), self, and super (relative).

pennsylvania state trees hemlock eastern belt rust ohio beltmag
(Source: beltmag.com)

Check your inbox Medium emailed you at to complete your subscription. Medium is an open platform where 170 million readers come to find insightful and dynamic thinking.

Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox.

In this post, I’ll explain the module system using practical examples so you get a clear understanding of how it works and can immediately start applying this in your projects. Since Rust ’s module system is quite unique, I request the reader to read this post with an open mind and resist comparing it with how modules work in other languages.

Let’s use this file structure to simulate a real world project: These 3 examples should be sufficient to explain how Rust ’s module system works.

If we look at our module tree, the print_user_model function sits in the crate::models::user_model path. The fully qualified name gets too lengthy if our file organization is multiple directories deep.

aanbouw houtskeletbouw ralus afbeeldingen bois een maison frank extension waarom added extra modulaire belge baraque cabine manoirs architecture houtskelet woninguitbreiding
(Source: www.ralus.be)

We can call it by using the fully qualified name crate::routes::health_route::print_health_route() but we can also use a relative path super::health_route::print_health_route();. Notice that we’ve used super to refer to the parent scope.

The super keyword in module path refers to the parent scope Dependencies added to Cargo.Tom are available globally to all modules inside the project.

The Rust module system can be very confusing and difficult to understand when you are just starting out learning Rust. Something as simple as just putting a function in another file and importing it into your main.rs can send you on a frustrating search and leave you with even more questions.

Ok. We forgot to make meow() public using the pub keyword, so we will fix that now and try again. The mistake in the above code is that it assumes there is a 1 to 1 mapping between module name and our directory structure.

Rust's module paths are not tied directly to the file system. That is, think of the module structure as its own thing independent of the file system layout.

rot brown diseases disease plums plum fruit plant apples root similar
(Source: www.staff.ncl.ac.uk)

Note that we need to use the pub keyword to allow each function to be visible to other modules (and you can also make things private to a module by omitting the pub keyword). So we can see that mod cat created a kind of module path with the function meow() nested below it, even though it is in the same file.

And the module itself is nested below a global namespace called crate. For a simple example like this you may think it is unnecessarily complex but when you are writing a library and you want to provide a nice import structure for your API without needing to match that exact structure in your file system, this is a really nice feature.

Ok, so hopefully multiple modules in 1 file makes sense. Let's return to our first example, with meow() declared in another file, named cat.rs.

This is where Rust's module system hopefully starts to make more sense. But without the pub keyword, the nested module is invisible to the parent.

I hope you are starting to see the flexibility that the Rust module system gives you over your entire namespace hierarchy. You can organize your files in a way that is convenient for you, and you can export your structs and modules in the way that makes more sense for the caller.

hotel badezimmer modern rustikales martano italien bad ovale bathroom stone masseria tile fracasso paolo bagni wanddekoration tiles italy cactus bath
(Source: deavita.com)

In my own code I prefer to declare the entire module structure in main.rs (or lib.rs for library crates), which avoids the need for any mod.rs files while offering all the same functionality. When I discovered this, that was the moment when I realized how powerful the Rust module system really is.

Only use pub when you need to make something visible to the parent scope. Hopefully this article has helped to make the Rust module system a little easier to understand.

If you want to read more about this, I highly recommend the documentation at Rust By Example. I found a lot of the official documentation difficult to understand at first, but once I understood the basics of modules I was able to go back and re-read them and everything started to fall into place.

Other Articles You Might Be Interested In

01: Outdoor Dining Virginia Beach Boardwalk
02: Outdoor Restaurants In Long Beach Ny
03: Outdoor Restaurants Long Beach Ny
04: Outlook For Boston Real Estate Market
05: Facebook.com Feedback
06: Facebook.com Find My Account
07: Facebook.com Forgot Password
08: Facebook.com Frame Studio
09: Facebook.com Full Site
10: Facebook.com Kkm
Sources
1 www.facebook.com - https://www.facebook.com/kementeriankesihatanmalaysia
2 www.facebook.com - https://www.facebook.com/kementeriankesihatanmalaysia/
3 www.facebook.com - https://www.facebook.com/KKMPlumbing/
4 www.facebook.com - https://www.facebook.com/KKM-SOLAR-102692335000637
5 www.facebook.com - https://www.facebook.com/kkmsolar/posts/
6 www.reddit.com - https://www.reddit.com/r/facebook/comments/kkm3mf/i_got_new_laptop_a_now_i_cant_send_special/
7 www.yellowpages.com - https://www.yellowpages.com/mound-house-nv/mip/kkm-precison-7210392
8 www.nationalrail.co.uk - https://www.nationalrail.co.uk/stations/KKM/details.html
9 www.slideshare.net - https://www.slideshare.net/suediahmad/penetapan-kkm