Durch Befolgen dieser Anleitung habe ich ein Frachtprojekt erstellt.
src/main.rs
fn main() {
hello::print_hello();
}
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
was ich benutze mit
cargo build && cargo run
und es kompiliert ohne Fehler. Jetzt versuche ich, das Hauptmodul in zwei Teile zu teilen, kann aber nicht herausfinden, wie ein Modul aus einer anderen Datei eingefügt werden kann.
Mein Projektbaum sieht so aus
├── src
├── hello.rs
└── main.rs
und den Inhalt der Dateien:
src/main.rs
use hello;
fn main() {
hello::print_hello();
}
src/hello.rs
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
Wenn ich es mit kompiliere cargo build
bekomme ich
error[E0432]: unresolved import `hello`
--> src/main.rs:1:5
|
1 | use hello;
| ^^^^^ no `hello` external crate
Ich habe versucht, den Vorschlägen des Compilers zu folgen und habe Folgendes geändert main.rs
:
#![feature(globs)]
extern crate hello;
use hello::*;
fn main() {
hello::print_hello();
}
Aber das hilft immer noch nicht viel, jetzt verstehe ich Folgendes:
error[E0463]: can't find crate for `hello`
--> src/main.rs:3:1
|
3 | extern crate hello;
| ^^^^^^^^^^^^^^^^^^^ can't find crate
Gibt es ein triviales Beispiel dafür, wie ein Modul aus dem aktuellen Projekt in die Hauptdatei des Projekts aufgenommen wird?
Antworten:
Sie brauchen das nicht
mod hello
in Ihrerhello.rs
Datei. Code in einer beliebigen Datei außer dem Kistenstamm (main.rs
für ausführbare Dateien,lib.rs
für Bibliotheken) wird automatisch in einem Modul mit einem Namespace versehen.Verwenden
hello.rs
Siemain.rs
, um den Code von in Ihren einzuschließenmod hello;
. Es wird auf den Code erweitert, der sich befindethello.rs
(genau wie zuvor). Ihre Dateistruktur bleibt unverändert, und Ihr Code muss geringfügig geändert werden:main.rs
::hello.rs
::quelle
use
ist nur eine Namespace-Sache, währendmod
in der Datei zieht. Sie würdenuse
zum Beispiel verwenden, um dieprint_hello
Funktion aufrufen zu können, ohne den NamespaceWenn Sie verschachtelte Module haben möchten ...
Rost 2018
Es ist nicht mehr erforderlich , um die Datei zu haben
mod.rs
(obwohl es immer noch unterstützt wird). Die idiomatische Alternative besteht darin, der Datei den Namen des Moduls zu geben:main.rs
my.rs
Rost 2015
Sie müssen eine
mod.rs
Datei in Ihrem Ordner mit demselben Namen wie Ihr Modul ablegen. Rust by Example erklärt es besser.main.rs
mod.rs
quelle
inaccessible.rs
in verwendennested.rs
... wie würde ich das tun?#[path = "inaccessible.rs"]
und in der nächsten Zeile:mod inaccessible;
mod inaccessible;
tomy/mod.rs
, um es zum Submodul zu machen, und greiftmy
dannnested.rs
über das relative Pfad auf das Geschwistermodul zusuper::inaccessible::function()
. Sie brauchenpath
hier kein Attribut.Ich mag die Antwort von Gardener sehr. Ich habe den Vorschlag für meine Moduldeklarationen verwendet. Jemand meldet sich bitte, wenn es ein technisches Problem gibt.
main.rs
utils / thing.rs
other_utils / other_thing.rs
quelle
fn
mit demselben Namen wie die Datei, in der er sich befand , erneut zu exportieren .#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;