Das F # -Äquivalent von C # ist 'out'

7

Ich überschreibe eine C # Bibliothek zu F # und ich muss den folgenden Code übersetzen

%Vor%

Was entspricht dem out Schlüsselwort in F #?

    
kasperhj 24.02.2015, 08:32
quelle

4 Antworten

8

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%

Option 1

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%

Option 2

Sie können einen veränderbaren Wert verwenden, indem Sie seine Adresse mit dem Operator & übergeben:

%Vor%

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

codieren %Vor%

Option 3

Sie können eine Referenzzelle verwenden:

%Vor%

Die Ausgabe:

%Vor%

Warnung!

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:

%Vor%

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.

    
phoog 24.02.2015, 18:42
quelle
6

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%     
wasatz 24.02.2015 08:52
quelle
5

Sie müssen eine Referenzzelle verwenden.

%Vor%     
Max Malook 24.02.2015 08:51
quelle
1

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%     
Fábio Junqueira 22.05.2017 15:20
quelle

Tags und Links