Подтвердить что ты не робот

Как включить модуль из другого файла из того же проекта?

Следуя этому руководству, я создал проект 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.

4b9b3361

Ответ 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()'");
}