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 diviser le module principal en deux mais je ne peux pas comprendre comment inclure un module d'un autre fichier.
Mon arborescence 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 j'ai modifié main.rs
pour:
#![feature(globs)]
extern crate hello;
use hello::*;
fn main() {
hello::print_hello();
}
Mais cela n'aide toujours pas beaucoup, maintenant je comprends ceci:
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 de la façon d'inclure un module du projet actuel dans le fichier principal du projet?
Réponses:
Vous n'avez pas besoin du
mod hello
dans votrehello.rs
fichier. Le code dans n'importe quel fichier sauf la racine de la crate (main.rs
pour les exécutables,lib.rs
pour les bibliothèques) est automatiquement mis en espace dans un module.Pour inclure le code de
hello.rs
votremain.rs
, utilisezmod hello;
. Il est étendu au code qui se trouvehello.rs
(exactement comme vous l'aviez auparavant). Votre structure de fichiers continue de la même manière et votre code doit être légèrement modifié:main.rs
:hello.rs
:la source
use
est juste une chose d'espace de noms, tandis qu'ilmod
extrait le fichier. Vous utiliseriezuse
, par exemple, pour pouvoir appeler laprint_hello
fonction sans avoir à préfixer avec l'espace de nomsSi vous souhaitez avoir des modules imbriqués ...
Rouille 2018
Il n'est plus nécessaire d'avoir le fichier
mod.rs
(bien qu'il soit toujours pris en charge). L'alternative idiomatique est de nommer le fichier le nom du module:main.rs
my.rs
Rouille 2015
Vous devez mettre un
mod.rs
fichier dans votre dossier du même nom que votre module. Rust by Example l' explique mieux.main.rs
mod.rs
la source
inaccessible.rs
dansnested.rs
... comment pourrais - je faire cela?#[path = "inaccessible.rs"]
et sur la ligne suivante:mod inaccessible;
mod inaccessible;
àmy/mod.rs
pour en faire un sous-module demy
, puis accède au module frère à partirnested.rs
d'un chemin relatifsuper::inaccessible::function()
. vous n'avez pas besoin d'path
attribut ici.J'aime vraiment la réponse de Gardener. J'ai utilisé la suggestion pour mes déclarations de module. Quelqu'un s'il vous plaît intervenir s'il y a un problème technique avec cela.
main.rs
utils / thing.rs
other_utils / other_thing.rs
la source
fn
avec le même nom que le fichier dans#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;