Как импортировать функции в Rust из подкаталогов без использования mod.rs

Я работаю над проектом 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;), но я сомневаюсь, что это хорошая практика.

prog-fh 12.07.2024 11:59

использование #[path = "others/utils.rs"] до того, как mod others; сработает!

Just_Another_Dev 12.07.2024 13:16
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать атрибут #[path], чтобы объявить нестандартную структуру каталогов:

#[path = "others/utils.rs"]
mod others;

Но, пожалуйста, не надо. Нестандартная структура — это плохо. Создание /others/mod.rs и экспорт элементов оттуда — это правильный путь. Альтернативно вы можете создать /others.rs, который будет иметь ту же роль, что и others/mod.rs.

Ответ принят как подходящий

Итак, я на самом деле нашел два метода, которые выглядят следующим образом:

1]

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! :)

2]

#[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 в корневом каталоге, и оба эти метода в данном случае работают очень хорошо.

Just_Another_Dev 12.07.2024 13:34

Я просто пробую что-то новое, я новичок в этом языке.

Just_Another_Dev 12.07.2024 13:41

Другие вопросы по теме