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


после данное руководство Я создал грузовой проект

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 Я

modules/src/main.rs:1:5: 1:10 error: unresolved import (maybe you meant `hello::*`?)
modules/src/main.rs:1 use hello;
                                                  ^~~~~
error: aborting due to previous error
Could not compile `modules`.

Я попытался следовать предложениям компилятора и изменил main.rs к

#![feature(globs)]

extern crate hello;

use hello::*;

fn main() {
    hello::print_hello();
}

но это все еще не очень помогает, теперь я получаю это

modules/src/main.rs:3:1: 3:20 error: can't find crate for `hello`
modules/src/main.rs:3 extern crate hello;
                                              ^~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
Could not compile `modules`.

есть ли тривиальный пример того, как включить один модуль из текущего проекта в основной файл проекта?

кроме того, я бегу ржавчины 0.13.0-ночные и грузовые 0.0.1-предночные.

2 54

2 ответа:

вам не нужно mod hello на . Код на любом файле, кроме корня ящика (main.rs для исполняемых файлов, lib.rs для библиотек) автоматически помещается в пространство имен модуля.

включить код hello.rs на main.rs используйте mod hello;. Он расширяется до кода, который находится на hello.rs (точно так же, как и раньше). Ваша файловая структура остается прежней, и ваш код должен быть немного изменено:

главная.РС:

mod hello;

fn main() {
    hello::print_hello();
}

Здравствуйте.РС:

pub fn print_hello() {
    println!("Hello, world!");
}

вам нужно mod.rs файл в вашей папке. ржавчина на примере объясняет это лучше.

$ 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()`");
}