Wie überwinde ich Matcharme mit inkompatiblen Typen für Strukturen, die dasselbe Merkmal implementieren?

7

Ich versuche, den Befehl cat zu schreiben, um Rust zu lernen, aber ich kann anscheinend keine Befehlszeilenargumente in Leser-Strukturen konvertieren.

%Vor%

Fehler:

%Vor%

Es scheint nicht so, als wäre es möglich, Merkmal-Implementierer (verwandt) polymorph zu vergleichen >. Wie kann ich entweder ein File oder Stdin als Leser verwenden?

    
AJcodez 15.10.2014, 09:18
quelle

4 Antworten

11

Das Problem ist, dass stdin() ein Objekt vom Typ Stdio und File::open(...).unwrap() ein Objekt vom Typ File zurückgibt. In Rust müssen alle Arme einer Übereinstimmung Werte desselben Typs zurückgeben.

In diesem Fall wollten Sie wahrscheinlich ein gemeinsames Objekt Read zurückgeben. Leider Read ist ein Merkmal, so dass Sie es nicht nach Wert übergeben können. Die einfachste Alternative besteht darin, auf die Heap-Zuweisung zurückzugreifen:

%Vor%     
PEPP 15.10.2014, 10:43
quelle
8

Die angenommene Antwort funktioniert nicht mehr mit Rust v1.0 . Die Hauptaussage ist jedoch immer noch wahr: Matcharme müssen die gleichen Typen zurückgeben. Das Zuweisen der Objekte auf dem Heap löst das Problem.

%Vor%     
Lukas Kalbertodt 04.10.2015 14:02
quelle
8

Hier ist eine Variation von Lukas Antwort, die das Boxen vermeidet:

%Vor%

Der Trick besteht darin, let -Bindungen zu verwenden, die nur auf einigen Codepfaden initialisiert werden, während sie immer noch eine ausreichend lange Lebensdauer haben, um sie als Ziel eines ausgeliehenen Zeigers verwenden zu können.

    
Francis Gagné 04.10.2015 20:10
quelle
4

Die coalesce -Kiste bietet eine Möglichkeit, dies ohne Boxen zu tun und weniger ausführlich als meine andere Antwort . Die Idee ist, eine einfache Aufzählung zu verwenden, die den konkreten Typ für jeden Arm enthalten kann, und ein Makro ( coalesce! ), das auf match expandiert, wobei der Körperausdruck für jeden Arm gleich ist.

%Vor%     
Francis Gagné 22.10.2016 21:56
quelle

Tags und Links