Как включить модуль из другого файла из того же проекта?
Следуя этому руководству, я создал проект 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
Есть ли тривиальный пример того, как включить один модуль из текущего проекта в основной файл проекта?
Также я использую Rust 1.37.0.
Ответы
Ответ 1
Вам не нужен mod hello
в вашем файле hello.rs
. Код в любом файле, кроме корня ящика (main.rs
для исполняемых файлов, lib.rs
для библиотек), автоматически распределяется по пространству имен в модуле.
Чтобы включить код из hello.rs
в main.rs
, используйте mod hello;
. Он расширяется до кода, который находится в hello.rs
(именно так, как вы это делали раньше). Структура вашего файла остается прежней, и ваш код должен быть слегка изменен:
main.rs
:
mod hello;
fn main() {
hello::print_hello();
}
hello.rs
:
pub fn print_hello() {
println!("Hello, world!");
}
Ответ 2
Вам нужен файл mod.rs
в вашей папке. Rust by Example объясняет это лучше.
$ tree .
.
|-- my
| |-- inaccessible.rs
| |-- mod.rs
| |-- nested.rs
'-- split.rs
main.rs
mod my;
fn main() {
my::function();
}
mod.rs
pub mod nested; //if you need to include other modules
pub fn function() {
println!("called 'my::function()'");
}