Я работаю над проектом Rust и хочу организовать свой код в несколько файлов и подкаталогов. У меня есть файл main.rs
, в который я хочу импортировать модули из других файлов и подкаталогов.
Например, у меня есть others/utils.rs
(в подкаталоге корневого каталога), и в этом файле есть функция, я хочу импортировать эту функцию в main.rs
, но дело в том, что я не хочу использовать имя файла как mod.rs
, ни я хочу переместить others/utils.rs
из его подкаталога.
Я также не хочу заключать функцию в mod {}
или создавать mod.rs
в others
, импортировать туда функцию и экспортировать оттуда.
Как я могу объявить и импортировать модуль others/utils.rs
из подкаталога Others в файл main.rs, не используя mod.rs и не перемещая файл? Я хотел бы иметь возможность доступа к функциям и типам из utils.rs непосредственно в main.rs.
Можете ли вы привести пошаговый пример того, как этого добиться?
src/others/utils.rs
:-
pub fn get_hello() -> String {
return "Hello, World!".to_string();
}
Я пробовал импортировать fn get_hello
вот так(main.rs
):-
mod others; // results in error, it expects a file `src/others/mod.rs`
use others::get_hello;
использование #[path = "others/utils.rs"]
до того, как mod others;
сработает!
Вы можете использовать атрибут #[path], чтобы объявить нестандартную структуру каталогов:
#[path = "others/utils.rs"]
mod others;
Но, пожалуйста, не надо. Нестандартная структура — это плохо. Создание /others/mod.rs
и экспорт элементов оттуда — это правильный путь. Альтернативно вы можете создать /others.rs
, который будет иметь ту же роль, что и others/mod.rs
.
Итак, я на самом деле нашел два метода, которые выглядят следующим образом:
mod others { pub mod utils }; // others is the dir, and utils is the file name
use others::utils::get_hello; // use the others/utils.rs file as a module similar to mod.rs
println!("{}", get_hello()); // Hello, World! :)
#[path = "others/utils.rs"]
mod utils; // use the utils.rs with directly specifying its path
println!("{}", utils::get_hello()); // Hello, World! :)
Хорошего дня.
@ChayimFriedman, как вы можете прочитать в исходном вопросе, я спросил об импорте без использования mod.rs
или без создания utils.rs
в корневом каталоге, и оба эти метода в данном случае работают очень хорошо.
Я просто пробую что-то новое, я новичок в этом языке.
Вы могли бы использовать атрибут пути (
#[path = "others/utils.rs"]
передmod others;
), но я сомневаюсь, что это хорошая практика.