2016-07-13 9 views
0

Ich habe das Modul mod1.rs:Was wird importiert, wenn ich eine Struktur von einem anderen Modul verwende?

pub struct Foo; 

impl Foo {} 

impl Drop for Foo { 
    fn drop(&mut self) {} 
} 

In file2.rs ich use mod1::Foo; schrieb.

  1. Was muß ich eigentlich in file2.rs? Nur struct Foo, impl Foo? Was ist mit impl Drop for Foo?

  2. Wenn ich alle Züge für Foo in file2.rs bekommen, und ich schreibe fn my_func(foo: Foo)..., was habe ich hier? Ist Foo ein struct oder ein Merkmal (impl Foo) hier?

ich das Buch Rust und Handbuch lesen, aber sie erklären nur explizite Nutzung, nicht erwähnen, was mit trait mit dem gleichen Namen geschieht (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.

+1

[Dies ist eine gute Lektüre] (https://doc.rust-lang.org/book/crates-and-modules.html). – squiguy

Antwort

4

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 Fooist 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.

Verwandte Themen