Следуя этому руководству, я создал проект Cargo.
src/main.rs
fn main() {
hello::print_hello();
}
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
который я использую
cargo build && cargo run
и компилируется без ошибок. Теперь я пытаюсь разделить основной модуль на две части, но не могу понять, как включить модуль из другого файла.
Дерево моего проекта выглядит так
├── src
├── hello.rs
└── main.rs
и содержимое файлов:
src/main.rs
use hello;
fn main() {
hello::print_hello();
}
src/hello.rs
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
Когда я компилирую его, cargo build
я получаю
error[E0432]: unresolved import `hello`
--> src/main.rs:1:5
|
1 | use hello;
| ^^^^^ no `hello` external crate
Я попытался последовать предложениям компилятора и изменил его main.rs
на:
#![feature(globs)]
extern crate hello;
use hello::*;
fn main() {
hello::print_hello();
}
Но это все равно мало помогает, теперь я понял:
error[E0463]: can't find crate for `hello`
--> src/main.rs:3:1
|
3 | extern crate hello;
| ^^^^^^^^^^^^^^^^^^^ can't find crate
Есть ли тривиальный пример того, как включить один модуль из текущего проекта в основной файл проекта?
Ответы:
Вам не нужен
mod hello
в вашемhello.rs
файле. Код в любом файле, кроме корневого ящика (main.rs
для исполняемых файлов,lib.rs
для библиотек), автоматически помещается в пространство имен в модуле.Чтобы включить код из
hello.rs
в вашmain.rs
, используйтеmod hello;
. Он расширяется до кода, который находится внутриhello.rs
(точно так же, как и раньше). Ваша файловая структура остается прежней, и ваш код необходимо немного изменить:main.rs
:hello.rs
:источник
use
это просто вещь пространства имен, покаmod
тянет файл. Вы могли бы использоватьuse
, например, чтобы иметь возможность вызыватьprint_hello
функцию без префикса с пространством именЕсли вы хотите иметь вложенные модули ...
Ржавчина 2018
Он никогда больше не требуется иметь файл
mod.rs
(хотя он по - прежнему поддерживается). Идиоматическая альтернатива - назвать файл именем модуля:main.rs
my.rs
Ржавчина 2015
Вам нужно поместить
mod.rs
файл в вашу папку с тем же именем, что и ваш модуль. Rust by Example объясняет это лучше.main.rs
mod.rs
источник
inaccessible.rs
вnested.rs
... как бы мне это сделать?#[path = "inaccessible.rs"]
и в следующей строке:mod inaccessible;
mod inaccessible;
чтобыmy/mod.rs
сделать его подмодулемmy
, а затем получить доступ к родственному модулюnested.rs
по относительному путиsuper::inaccessible::function()
. вам не нуженpath
атрибут здесь.Мне очень нравится ответ Гарденера. Я использовал это предложение для объявлений моих модулей. Кто-нибудь, пожалуйста, свяжитесь с нами, если возникнут технические проблемы.
main.rs
utils / thing.rs
other_utils / other_thing.rs
источник
fn
с тем же именем, что и файл, в котором он был.#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;