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:
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.
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:
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.
Tags und Links rust struct default-value