Wie deklariere ich eine Struktur, in der nur einige Member einen Wert aus einer anderen Struktur verwenden können?

8

Rust verfügt über eine nützliche Funktion, mit der Sie eine vorhandene Struktur verwenden und nur einige ihrer Elemente überschreiben können. Zum Beispiel ein Wert der folgenden Struktur

%Vor%

kann durch Übergeben einer Strukturinstanz (z. B. SomeTool::default() ) initialisiert werden:

%Vor%

Ich möchte SomeTool deklarieren, ohne jeden Callback explizit auflisten zu müssen (das Hinzufügen neuer Callbacks in der Zukunft kann zu vielen Additionen von None in einer Codebasis führen).

Das funktioniert gut, aber jetzt könnte ich versehentlich unique_id für eine andere Initialisierung weglassen und es würde alles verwenden, was in default ist.

Gibt es eine Möglichkeit, eine Struktur zu beschreiben, bei der einige Elemente außer Kraft gesetzt werden können, andere jedoch nicht?

Beachten Sie, dass der reale Anwendungsfall mehr Mitglieder hat als dies (wodurch die Wahrscheinlichkeit von Unfällen höher wird), nur vereinfacht für die Frage.

    
ideasman42 12.12.2016, 04:40
quelle

1 Antwort

8

Da Ihr unique_id eindeutig sein soll, sollte es keinen Default -Konstruktor haben. Wenn Sie jedoch Default impl aus einem hypothetischen UniqueId -Typ entfernen, können Sie Default für SomeTool nicht ableiten.

Die derzeit funktionierende Lösung besteht darin, alle Felder, die keinen Wert erfordern, in eine Unterstruktur zu verschieben und nicht Default für SomeTool zu implementieren. Somit könnten Sie SomeTool wie folgt verwenden:

%Vor%

Es gibt ein hypothetisches Merkmal, das Rust in Zukunft bekommen könnte, was es Ihnen erlaubt, zwei Strukturen mit denselben Feldern als Basisausdruck in einem Strukturausdruck zu haben. Mit dieser Funktion können Sie die Substruktur zum Initialisieren aller Felder verwenden, die die Unterstruktur und SomeTool gemeinsam haben, jedoch nicht mehr.

    
oli_obk - ker 12.12.2016 09:01
quelle

Tags und Links