Wie mache ich einen grundlegenden import - /einschließen, der eine Funktion aus einem anderen Modul in Rust 2015?
Ich kann nicht herausfinden, wie zu zählen (oder importieren, injizieren, oder ein anderes Wort) eine Funktion aus einer Datei (Modul) in ein anderes.
Starte ich ein neues Projekt mit
$ cd ~/projects
$ cargo new proj --bin
$ cd proj
$ tree
.
|
-- Cargo.toml
-- src
|
-- main.rs
Ich ändern main.rs
und erstellen Sie eine neue Datei a.rs
(innerhalb der src
dir) mit dem folgenden code:
main.rs
fn main() {
println!("{}", a::foo());
}
ein.rs
pub fn foo() -> i32 { 42 }
Führe ich das Projekt mit cargo run
und bekomme die Fehlermeldung:
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`
Es scheint, dass ich brauche, um den import der a
irgendwie. Ich versuchte, fügen Sie Folgendes als erste Zeile zum 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
Habe ich gelesen, die Anleitung aber immer noch nicht herausfinden, wie die Importe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In einem mainish module (main).rs, lib.rs, oder subdir/mod.rs), die Sie schreiben müssen
mod a;
für alle anderen Module, die Sie verwenden möchten, in das gesamte Projekt (oder in den Ordner).In allen anderen Modulen, die Sie schreiben müssen
use a;
oderuse a::foo;
Du bist bei weitem nicht der einzige Mensch zu sein, verwirrt von diesem, und es ist durchaus möglich, besser zu machen, aber irgendwelche änderungen an der Modul-system bekommen werden abgelehnt als "zu verwirrend".
Edit: diese Antwort wurde geschrieben für die "Rust 2015" Sprache standard. Änderungen wurden für die "Rost-2018" - standard finden Sie unter in diesem blog-post und die edition guide
extern crate
notwendig? Ich dachte, dass jedes Rost-Datei eine separate Kiste (unit of-compilation).mod
Anweisungen kompiliert werden, wie eine Kiste. Dies ist die Einheit für die Zusammenstellung.but any changes to the module system will get rejected as "too confusing"
Der vorhandenen Modul-system ist "zu unübersichtlich".mod a;
im Haupt-und in der Sekundär-Dateienuse a;
- sollte es nicht andersherum sein - mein main ist mit Sachen von anderen Dateien..In Rust, es gibt einige Stichworte zum Umgang mit Modulen:
extern crate
extern crate
füllt die Lücke zwischen Ladung und Rost. Wir schreiben von code in einer .rs-Datei, diese Datei kompiliert werden kann, mitrustc
. Ladung verwalten externe Abhängigkeiten und rufenrustc
. Dieextern crate ...
Zeile weist den compiler an, suchen Sie für dieses namespace, so ist es eindeutig.mod
mod
hat zwei Verwendungen:Module können sein:
use
use
Import eines namespace. Wir sind verpflichtet, zu verkünden, was werden wir nutzen, bevor es zu benutzen. Die Verwendung der Klausel ist ziemlich streng, wenn wir sagenuse module1::moduleA;
kein anderes Modul ausmodule1
erhältlich sein wird, abermoduleA
. Ein Sternchen (*
) kann verwendet werden um alles in einem Modul:use module1::*;
. Die Sätze können auch verwendet werden:use module1::{moduleA, moduleB};
Beispiel:
mod.rs enthält:
main.rs enthält:
Symbole sind nur nutzbar, die von innerhalb des Moduls. Wenn Sie möchten, überqueren diese Barriere (auch auf ein lokal deklariertes Modul) benötigen wir, um Sie der öffentlichkeit mit dem Stichwort
pub
.moduleA
braucht Sachen ausmoduleB
? Und vielleicht Umgekehrt?use crate::parent
oderuse crate::sibling
.