I have a project with the following structure:
where
// a/mod.rs
pub mod a1;
// b/mod.rs
pub mod b1;
I want to use helper functions in b1.rs from a1.rs, how can I do it?
I have a project with the following structure:
where
// a/mod.rs
pub mod a1;
// b/mod.rs
pub mod b1;
I want to use helper functions in b1.rs from a1.rs, how can I do it?
Module b1
lives at crate::b::b1
. You can do one of the following: (crate
here is the crate
keyword, not the name of your crate)
crate::b::b1::function(1, 2);
// or
use crate::b::b1;
b1::function(1, 2)
Hi thanks for reply!
I also have some macros defined in b1, how can I use them in a1.rs?
UPDATED:
macro should be same. I'm using vscode and it gives me hint that can't find the macro but actually the file can compile.
UPDATED2:
ah, it can't compile. The macro I used is in test, when I run cargo build it won't be built, so I still can't use the macros.
macro_rules!
macros within the same crate are scoped slightly oddly - you'll first need to use #[macro_use]
on the module in the parent scope to bring them "up", and then they'll be usable in any module defined after that statement.
So, in b/mod.rs
, you'd want to add #[macro_use]
to b1.rs
:
#[macro_use]
mod b1;
And then in lib.rs
, you'd add #[macro_use]
to a
to re-export them to the top level. Additionally, you'll want to make sure that b
is declared after a
. Locally defined macros are picked up and become usable in the same order they're defined, which helps with making code well-defined, but can be annoying to use if macros are defined and used throughout the crate.
#[macro_use]
mod b;
// after `mod b`:
mod a;
There's a chapter in the book on this import mechanic, not that it goes into too much more detail: Macros
My general strategy for dealing with order-dependence is to have all macros either completely local - used only directly after they're defined - or put into a macros.rs
module that is "above" all other modules and that the whole crate shares.
Thanks! It works.
This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.