web-dev-qa-db-fra.com

Comment inclure un module d'un autre fichier du même projet?

En suivant ce guide j'ai créé un projet Cargo.

src/main.rs

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

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

que je cours en utilisant

cargo build && cargo run

et il compile sans erreurs. Maintenant, j'essaie de scinder le module principal en deux mais je ne peux pas comprendre comment inclure un module à partir d'un autre fichier.

Mon arbre de projet ressemble à ceci

├── src
    ├── hello.rs
    └── main.rs

et le contenu des fichiers:

src/main.rs

use hello;

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

src/hello.rs

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

Quand je le compile avec cargo build Je reçois

error[E0432]: unresolved import `hello`
 --> src/main.rs:1:5
  |
1 | use hello;
  |     ^^^^^ no `hello` external crate

J'ai essayé de suivre les suggestions du compilateur et modifié main.rs à:

#![feature(globs)]

extern crate hello;

use hello::*;

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

Mais cela n'aide toujours pas beaucoup, maintenant je comprends:

error[E0463]: can't find crate for `hello`
 --> src/main.rs:3:1
  |
3 | extern crate hello;
  | ^^^^^^^^^^^^^^^^^^^ can't find crate

Existe-t-il un exemple trivial expliquant comment inclure un module du projet actuel dans le fichier principal du projet?

En outre, je cours Rust 1.37.0.

83
ave

Vous n'avez pas besoin du mod hello dans votre hello.rs fichier. Code dans n'importe quel fichier sauf la racine de la caisse (main.rs pour les exécutables, lib.rs pour les bibliothèques) est automatiquement namespaced sur un module.

Pour inclure le code de hello.rs Sur ton main.rs, utilisation mod hello;. Il est étendu au code qui se trouve dans hello.rs (exactement comme avant). Votre structure de fichier continue de la même façon et votre code doit être légèrement modifié:

main.rs:

mod hello;

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

hello.rs:

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

Vous avez besoin du mod.rs fichier dans votre dossier. Rust by Example l'explique mieux.

$ 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