Was ist der Unterschied zwischen Verwendung und extern?

80

Ich bin neu bei Rust. Ich denke, das usewird verwendet, um Bezeichner in den aktuellen Bereich zu importieren und externum ein externes Modul zu deklarieren. Aber dieses Verständnis (vielleicht falsch) ergibt für mich keinen Sinn. Kann jemand erklären, warum Rust diese beiden Konzepte hat und welche Fälle geeignet sind, um sie zu verwenden?

Maralla
quelle
5
Beziehen Sie sich auf die Aussage extern crate foo;? Kisten und Module sind separate Konzepte in Rust. Vielleicht möchten Sie einen Blick auf "Grundlegende Terminologie: Kisten und Module" werfen , der den Unterschied zwischen den beiden erklärt (ich persönlich finde die folgenden Beispiele jedoch sehr ausführlich).
Qantas 94 Heavy

Antworten:

85

extern crate fooGibt an, dass Sie eine Verknüpfung zu einer externen Bibliothek herstellen möchten, und bringt den Kistennamen der obersten Ebene in den Gültigkeitsbereich (entspricht use foo). Ab Rust 2018 müssen Sie in den meisten Fällen nicht extern cratemehr verwenden, da Cargo den Compiler darüber informiert, welche Kisten vorhanden sind. (Es gibt ein oder zwei Ausnahmen )

use bar ist eine Abkürzung für die Referenzierung vollqualifizierter Symbole.

Theoretisch ist die Sprache nicht brauchen use - man kann immer nur voll qualifizieren , die Namen, aber Typisierung std::collections::HashMap.new(...)wäre sehr langweilig bekommen! Stattdessen können Sie nur use std::collections::HashMapeinmal eingeben und werden dann darauf HashMapverweisen.

Shepmaster
quelle
3
Ohne usekönnten wir nicht einmal stddie Fassade haben , die es ist. Entweder hätten wir eine einzige monolithische Standardbibliothekskiste, oder jeder würde sich mit der Tatsache befassen, dass dies Stringtatsächlich der Fall ist collections::string::String.
44

Die akzeptierte Antwort war zum Zeitpunkt des Schreibens korrekt. Es ist jedoch nicht mehr richtig. extern cratewird seit Rust 2018 fast nie mehr benötigt.

Sie müssen jetzt nur noch externe Abhängigkeiten zu Ihrer Cargo.toml hinzufügen.

use funktioniert genauso wie zuvor.

Lesen Sie mehr in der offiziellen Dokumentation .

Bearbeiten: Die akzeptierte Antwort wurde jetzt bearbeitet, um die Änderungen in Rust 2018 korrekt wiederzugeben.

Dropbear
quelle
Auch wenn es nicht notwendig ist, gibt es keinen Vorteil, wenn externe Kisten von Standardkisten getrennt werden? Wie extern crate failure;aberuse std::error::Error
Paul Razvan Berg
2
@PaulRazvanBerg Sie wollen nur klären, welche Importe aus der Standardbibliothek stammen und welche externe Importe sind? Zumindest nicht für mich, und ich denke auch nicht, dass dies empfohlen wird. Aber ich denke, Sie sollten Ihren Code so strukturieren, wie es für Sie am sinnvollsten ist.
Dropbear