web-dev-qa-db-ja.com

同じプロジェクトの別のファイルのモジュールを含める方法は?

このガイド に従って、貨物プロジェクトを作成しました。

src/main.rs

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

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

私が使用して実行する

cargo build && cargo run

そして、エラーなしでコンパイルします。今、私はメインモジュールを2つに分割しようとしていますが、別のファイルからモジュールを含める方法がわかりません。

私のプロジェクトツリーは次のようになります

├── 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

現在のプロジェクトの1つのモジュールをプロジェクトのメインファイルに含める簡単な例はありますか?

また、Rust 1.37.0を実行しています。

83
ave

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!");
}
159
Renato Zannon

フォルダーに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()`");
}
10
amxa