Wie gruppiert man 'Options' in Rust?

8

Ich habe einen Code-Block, in dem mehrere optionale Variablen gleichzeitig zugewiesen werden müssen. Es besteht nur eine sehr geringe Wahrscheinlichkeit, dass einer der Werte None ist. Daher ist es nicht besonders nützlich, jeden einzelnen fehlgeschlagenen Fall individuell zu behandeln.

Momentan schreibe ich die Schecks so:

%Vor%

Es wäre praktisch, wenn es möglich wäre, Zuordnungen zu gruppieren. Ohne dies fügt das Hinzufügen einer neuen Variablen den Block um eine Ebene ein, was für verrauschte Diffs sorgt und eine unnötig tiefe Einrückung verursacht:

%Vor%

Gibt es eine Möglichkeit, mehrere Option s in einer if-Anweisung zuzuweisen?

Einige bemerkenswerte Details:

Die erste Funktion, die fehlschlägt, sollte kurzgeschlossen werden und nicht die anderen anrufen. Sonst könnte es so geschrieben werden:

%Vor%

Tiefe Einrückung könnte mit einer Funktion vermieden werden, aber ich würde dies lieber nicht tun, da Sie den Körper vielleicht nicht in einem anderen Bereich haben möchten ...

%Vor%     
ideasman42 06.12.2016, 01:06
quelle

4 Antworten

10

Wie @SplittyDev sagte, können Sie ein Makro erstellen, um die gewünschte Funktionalität zu erhalten. Hier ist eine alternative makrobasierte Lösung, die auch das Kurzschlussverhalten beibehält:

%Vor%

Spielplatz

    
Erik Vesteraas 06.12.2016 02:59
quelle
4

Die Standardbibliothek enthält nicht genau diese Funktionalität, aber die Sprache ermöglicht es Ihnen, das gewünschte Verhalten mit einem kleinen Makro zu erstellen.

Folgendes habe ich mir ausgedacht:

%Vor%

Sie können all Ihre Optionen füttern und ein Tupel mit den unverpackten Werten erhalten, wenn alle Werte Some oder None sind, falls eine der Optionen None ist.

Im Folgenden finden Sie ein kurzes Beispiel für die Verwendung:

%Vor%

Hier ist eine vollständige Testsuite für das Makro: Rust Playground

    
SplittyDev 06.12.2016 01:54
quelle
4

Meine erste Neigung war, etwas zu tun, das der Antwort von swizard ähnlich ist, aber um es in eine Eigenschaft zu verpacken, um das zu machen Verkettung Reiniger. Es ist auch ein bisschen einfacher ohne die Notwendigkeit für zusätzliche Funktionsaufrufe.

Es hat den Nachteil, die Verschachtelung der Tupel zu erhöhen.

%Vor%     
Shepmaster 06.12.2016 02:45
quelle
1

Ehrlich gesagt sollte jemand bemerken, dass Option ein anwendungsfähiger Funktor ist:)

Der Code wird ziemlich hässlich sein, ohne Unterstützung in Rust zu curryen, aber es funktioniert und es sollte keinen lauten Unterschied machen:

%Vor%     
swizard 06.12.2016 02:32
quelle

Tags und Links