Ich versuche, den Befehl cat
zu schreiben, um Rust zu lernen, aber ich kann anscheinend keine Befehlszeilenargumente in Leser-Strukturen konvertieren.
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?
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:
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.
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.
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.
Tags und Links rust