Если у вас есть структура каталогов, подобная этой:
src/main.rs
src/module1/blah.rs
src/module1/blah2.rs
src/utils/logging.rs
Как вы используете функции из других файлов?
Из учебника по Rust кажется, что я должен быть в состоянии сделать это:
main.rs
mod utils { pub mod logging; }
mod module1 { pub mod blah; }
fn main() {
utils::logging::trace("Logging works");
module1::blah::doit();
}
logging.rs
pub fn trace(msg: &str) {
println!(": {}\n", msg);
}
blah.rs
mod blah2;
pub fn doit() {
blah2::doit();
}
blah2.rs
mod utils { pub mod logging; }
pub fn doit() {
utils::logging::trace("Blah2 invoked");
}
Однако это приводит к ошибке:
error[E0583]: file not found for module 'logging'
--> src/main.rs:1:21
|
1 | mod utils { pub mod logging; }
| ^^^^^^^
|
= help: name the file either logging.rs or logging/mod.rs inside the directory "src/utils"
Похоже, что импорт по пути, т.е. из main
в module1/blah.rs
, работает, а импорт пиров, т.е. blah2
из blah
, работает, но импорт из родительской области не работает.
Если я использую магическую директиву #[path]
, я могу заставить это работать:
blah2.rs
#[path="../utils/logging.rs"]
mod logging;
pub fn doit() {
logging::trace("Blah2 invoked");
}
Действительно ли мне нужно вручную использовать относительные пути к файлам для импорта чего-либо из уровня родительской области? Нет ли лучшего способа сделать это в Rust?
В Python вы используете from .blah import x
для локальной области, но если вы хотите получить доступ к абсолютному пути, вы можете использовать from project.namespace.blah import x
.