Ist es in Rust möglich, eine Funktion mit einem Standardargument zu erstellen?
fn add(a: int = 1, b: int = 2) { a + b }
function
parameters
arguments
rust
Jeroen
quelle
quelle
Option
und explizit übergebenNone
.Antworten:
Nein, das ist derzeit nicht der Fall. Ich halte es für wahrscheinlich, dass es irgendwann implementiert wird, aber es gibt derzeit keine aktive Arbeit in diesem Bereich.
Die hier verwendete typische Technik besteht darin, Funktionen oder Methoden mit unterschiedlichen Namen und Signaturen zu verwenden.
quelle
Da Standardargumente nicht unterstützt werden, können Sie mit ein ähnliches Verhalten erzielen
Option<T>
Dies erreicht das Ziel, den Standardwert und die Funktion nur einmal (statt bei jedem Aufruf) codieren zu lassen, ist aber natürlich noch viel mehr zu tippen. Der Funktionsaufruf sieht so aus
add(None, None)
, wie Sie es je nach Perspektive mögen oder nicht.Wenn Sie sehen, dass Sie nichts in die Argumentliste eingeben, da der Codierer möglicherweise vergisst, eine Auswahl zu treffen, liegt der große Vorteil hier in der expliziten Aussage. Der Aufrufer sagt ausdrücklich, dass er mit Ihrem Standardwert arbeiten möchte, und erhält einen Kompilierungsfehler, wenn er nichts einfügt. Betrachten Sie es als Tippen
add(DefaultValue, DefaultValue)
.Sie können auch ein Makro verwenden:
Der große Unterschied zwischen den beiden Lösungen besteht darin, dass das Schreiben mit "Option" -Al-Argumenten vollständig gültig
add(None, Some(4))
ist, mit dem Makromuster-Matching jedoch nicht (dies ähnelt den Standardargumentregeln von Python).Sie können auch eine "Argumente" -Struktur und die
From
/Into
Merkmale verwenden:Diese Auswahl ist offensichtlich viel mehr Code, aber im Gegensatz zum Makrodesign wird das Typsystem verwendet, was bedeutet, dass die Compilerfehler für Ihren Bibliotheks- / API-Benutzer hilfreicher sind. Auf diese Weise können Benutzer auch ihre eigene
From
Implementierung vornehmen , wenn dies für sie hilfreich ist.quelle
Nein, Rust unterstützt keine Standardfunktionsargumente. Sie müssen verschiedene Methoden mit unterschiedlichen Namen definieren. Es gibt auch keine Funktionsüberladung, da Rust Funktionsnamen verwendet, um Typen abzuleiten (Funktionsüberladung erfordert das Gegenteil).
Im Falle einer Strukturinitialisierung können Sie die Strukturaktualisierungssyntax wie folgt verwenden:
[Auf Anfrage habe ich diese Antwort von einer doppelten Frage abgekreuzt]
quelle
Wenn Sie mit Rust 1.12 oder höher verwenden , können Sie zumindest Schliesser Argumente einfacher zu bedienen mit
Option
undinto()
:quelle
Rust unterstützt keine Standardfunktionsargumente und ich glaube nicht, dass es in Zukunft implementiert wird. Also habe ich ein proc_macro duang geschrieben , um es in der Makroform zu implementieren.
Beispielsweise:
quelle
Eine andere Möglichkeit könnte darin bestehen, eine Aufzählung mit den optionalen Parametern als Varianten zu deklarieren, die so parametrisiert werden können, dass für jede Option der richtige Typ verwendet wird. Die Funktion kann implementiert werden, um einen Slice variabler Länge der Enum-Varianten zu nehmen. Sie können in beliebiger Reihenfolge und Länge sein. Die Standardeinstellungen werden innerhalb der Funktion als Erstzuweisungen implementiert.
Ausgabe:
quelle