Weder die Antwort von waratz noch die von Max Malook ist vollständig. Es gibt drei Möglichkeiten, Methoden mit out
-Parametern aufzurufen. Die zweite und dritte Möglichkeit funktionieren auch mit ref
-Parametern.
Nehmen Sie für die Beispiele den folgenden Typ an:
%Vor%Nehmen Sie auch an, dass wir eine Instanz dieses Typs haben:
%Vor%Sie können den F # -Compiler den out-Parameter behandeln lassen, indem Sie ihn mit dem Rückgabewert tupling:
%Vor%Das Ausführen der obigen Zeilen in F # interaktiv ergibt
%Vor% Sie können einen veränderbaren Wert verwenden, indem Sie seine Adresse mit dem Operator &
übergeben:
In F # interactive ist das Ergebnis
%Vor% Diese Option ist am besten, wenn Sie an eine andere Methode delegieren, da Sie den out-Parameter der aufrufenden Methode direkt an die aufgerufene Methode übergeben können. Wenn Sie beispielsweise einen Wrapper um IDictionary<_,_>
implementieren, können Sie die Methode TryGetValue
als
Sie können eine Referenzzelle verwenden:
%Vor%Die Ausgabe:
%Vor% Achten Sie darauf, das Schlüsselwort ref
nicht wie in C # für einen In / Out-Parameter zu verwenden. Zum Beispiel liefert das Folgende nicht das gewünschte Ergebnis:
Die Ausgabe:
%Vor% Warum behält success7
den Wert false
? Weil success7
eine unveränderbare Variable ist.
In C # macht ref
darauf aufmerksam, dass Sie einen Verweis auf eine Variable als Argument für einen ref
-Parameter übergeben. Es dient lediglich als Versicherung, dass der Programmierer des Aufrufers weiß, dass die Variable durch die aufgerufene Methode geändert werden kann. In F # jedoch erstellt ref
eine neue Referenzzelle, die eine Kopie von enthält, den Wert des folgenden Ausdrucks.
In diesem Fall erstellen wir eine Referenzzelle, die den kopierten Wert aus der Variablen success7
enthält, aber diese neue Referenzzelle keiner Variablen zuweist. Wir übergeben diese Referenzzelle dann an die GetValue-Methode, die den Inhalt der Referenzzelle ändert. Da die aufrufende Methode über keine Variable verfügt, die auf die geänderte Zelle verweist, kann der neue Wert der Referenzzelle nicht gelesen werden.
Sie sollten wahrscheinlich stattdessen eine Option oder ein Tupel zurückgeben. Da F # Mustervergleich hat, brauchen Sie wirklich keine out-Parameter, da es bessere Möglichkeiten gibt, mehr als einen Wert von einer Funktion zurückzugeben.
Also, so etwas wäre idiomatischer.
%Vor%where instance.GetValue ist ein
%Vor%Oder Sie könnten eine Option zurückgeben und etwas wie
tun %Vor%Ich denke, es ist auch erwähnenswert, dass der Wert des out-Parameters nicht initialisiert werden muss.
Es ist möglich folgendes zu tun:
%Vor%Dies könnte in Szenarien nützlich sein, in denen Sie eine .NET-Bibliotheksfunktion mit Arrays als Ausgabeparameter aufrufen, d. h .:
%Vor%