In file2.rs schrieb ich use mod1::Foo;
.
Was habe ich eigentlich in file2.rs? Nur struct Foo
, impl Foo
? Was ist mit impl Drop for Foo
?
Wenn Sie use
einen Typ wie eine Struktur oder eine Enumeration, erhalten Sie alle der inhärenten Methoden; die in der impl Foo
definierten. Sie könnten auch auf alle öffentlichen Felder des Typs zugreifen. hier
Wenn ich alle Züge für Foo
in file2.rs bekommen, und ich schreibe fn my_func(foo: Foo)
, was habe ich? Ist Foo
eine Struktur oder ein Merkmal (impl Foo
) hier?
impl Foo
ist kein Merkmal. trait Bar
definiert ein Merkmal. impl Bar for Foo
implementiert eine Eigenschaft für den Typ Foo
. impl Foo
erzeugt inhärente Methoden; diese sind nicht mit Merkmalen verbunden.
Ich lese das Rust Buch und Handbuch, aber sie erklären nur explizite Verwendung, nicht erwähnen, was passiert mit Merkmal mit dem gleichen Namen (impl). Das Rust-Buch sagt Ihnen, dass Sie die Eigenschaften explizit importieren müssen, wenn ja, und Drop
wird nicht importiert von use mod1::Foo
, das ist eine wirklich, wirklich schlechte Sache.
Das wäre eine sehr schlechte Idee für die Sprachdesigner gemacht zu haben. Zum Glück haben sie das nicht gemacht.Wenn Sie etwas importieren, kann der Code, der es importiert hat, es einfach verwenden. Der Code wird nicht gelöscht, wenn er nicht importiert wird.
Der Compiler selbst ist der Benutzer von Typen, die Drop
implementieren, so dass Sie es als die Compiler-Implementierung use Drop
irgendwo darin vorstellen können. Dies ist wahrscheinlich nicht wörtlich wahr, aber ein mentales Modell. Nur weil Ihr Code nicht importiert Drop
bedeutet nicht, dass einige andere Code nicht konnte.
Wie an anderer Stelle erwähnt, müssen Sie Drop
sowieso nicht importieren, da es included in the prelude ist.
[Dies ist eine gute Lektüre] (https://doc.rust-lang.org/book/crates-and-modules.html). – squiguy