Comment dois-je faire une importation de base/include d'une fonction d'un module à un autre dans la Rouille 2015?
Je ne trouve pas comment inclure (ou d'importation, injecter, ou quelque autre mot) d'une fonction à partir d'un fichier (module) à l'autre.
Je démarre un nouveau projet avec
$ cd ~/projects
$ cargo new proj --bin
$ cd proj
$ tree
.
|
-- Cargo.toml
-- src
|
-- main.rs
- Je modifier main.rs
et créer un nouveau fichier a.rs
(à l'intérieur de la src
dir), avec le code suivant:
principal.rs
fn main() {
println!("{}", a::foo());
}
un.rs
pub fn foo() -> i32 { 42 }
J'ai exécuter le projet avec cargo run
et obtenez l'erreur:
error[E0433]: failed to resolve: use of undeclared type or module `a`
--> src/main.rs:2:20
|
2 | println!("{}", a::foo());
| ^ use of undeclared type or module `a`
Il semble que j'ai besoin d'importer le a
en quelque sorte. J'ai essayé d'ajouter la suite d'une première ligne de main.rs
-
use a;
error[E0432]: unresolved import `a` --> src/main.rs:1:5 | 1 | use a; | ^ no `a` in the root
-
use a::*;
error[E0432]: unresolved import `a` --> src/main.rs:1:5 | 1 | use a::*; | ^ maybe a missing `extern crate a;`? error[E0433]: failed to resolve: use of undeclared type or module `a` --> src/main.rs:4:20 | 4 | println!("{}", a::foo()); | ^ use of undeclared type or module `a`
-
use a::foo;
error[E0432]: unresolved import `a` --> src/main.rs:1:5 | 1 | use a::foo; | ^ maybe a missing `extern crate a;`? error[E0433]: failed to resolve: use of undeclared type or module `a` --> src/main.rs:4:20 | 4 | println!("{}", a::foo()); | ^ use of undeclared type or module `a`
-
extern crate a; use a::foo;
error[E0463]: can't find crate for `a` --> src/main.rs:1:1 | 1 | extern crate a; | ^^^^^^^^^^^^^^^ can't find crate
-
extern crate proj; use proj::a::foo;
error[E0463]: can't find crate for `proj` --> src/main.rs:1:1 | 1 | extern crate proj; | ^^^^^^^^^^^^^^^^^^ can't find crate
J'ai lu le guide mais ne peut toujours pas comprendre comment le faire importations.
Vous devez vous connecter pour publier un commentaire.
Dans un mainish (module principal.rs, lib.rs, ou subdir/mod.rs), vous devez écrire
mod a;
pour tous les autres modules que vous souhaitez utiliser dans votre projet (ou dans le sous répertoire).Dans n'importe quel autre module, vous devez écrire
use a;
ouuse a::foo;
Vous êtes loin d'être la seule personne à être confus par cela, et il est certainement possible de faire mieux, mais toute modification du système de module sera rejeté comme "trop compliqué".
Edit: cette réponse a été écrit pour la "Rouille 2015" langue standard. Des modifications ont été apportées pour la "Rouille 2018" standard, voir ce blog et la edition guide de l'
extern crate
nécessaire? Je pensais que toutes Rouille fichier est une autre caisse (unité de compilation).mod
instructions seront compilées comme une cage. C'est l'unité de compilation.but any changes to the module system will get rejected as "too confusing"
Le module existant système est "trop compliqué".mod a;
en principal et secondaire fichiersuse a;
- ne devrait-elle pas être dans l'autre sens - mon principal est l'aide de matériel provenant d'autres fichiers..Dans la Rouille, il y a certains mots-clés à traiter avec des modules:
extern crate
extern crate
comble le fossé entre la Cargaison et la Rouille. Nous écrire du code dans un .rs fichier, ce fichier peut être compilé avecrustc
. La cargaison sera de gérer les dépendances externes et appelrustc
. Leextern crate ...
ligne indique au compilateur de look pour cet espace de noms, c'est donc sans ambiguïté.mod
mod
a deux usages:Modules peuvent être:
use
use
les importations d'un espace de noms. Nous sommes tenus d'annoncer ce que nous allons utiliser avant de l'utiliser. L'utilisation de la clause est assez strict, si nous avons de l'étatuse module1::moduleA;
aucun autre module demodule1
sera disponible maismoduleA
. Un astérisque (*
) peut être utilisé pour une utilisation tout au sein d'un module:use module1::*;
. Les ensembles peuvent être utilisés:use module1::{moduleA, moduleB};
Un exemple:
mod.rs contient:
principal.rs contient:
Symboles sont utilisables uniquement dans le module. Si vous voulez traverser cette barrière (même déclarés localement module) nous avons besoin de les rendre publiques, en utilisant le mot-clé
pub
.moduleA
besoins des trucs demoduleB
? Et peut-être vice-versa?use crate::parent
ouuse crate::sibling
.