Was ist die syntax für den Abgleich mit einem Verweis auf ein enum?
Es scheint, wie jedes einführende Dokument für Rost ist enum-Typen erklärt, wie match auf ein enum-Objekt, das Sie eigenen, aber was ist, wenn Sie nicht selbst das enum-Objekt, und Sie müssen nur einen Verweis darauf, dass Sie möchten, um dagegen? Ich weiß nicht, was wäre die syntax.
Hier ist ein code, wo ich versuche, die Partie auf einen Verweis auf eine enum:
use std::fmt;
use std::io::prelude::*;
pub enum Animal {
Cat(String),
Dog,
}
impl fmt::Display for Animal {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Animal::Cat(c) => f.write_str("c"),
Animal::Dog => f.write_str("d"),
}
}
}
fn main() {
let p: Animal = Animal::Cat("whiskers".to_owned());
println!("{}", p);
}
Den Rost Spielplatz gibt Fehler, die sich auf die beiden ersten Fälle des Spiels, wenn Sie versuchen, um es zu kompilieren:
error[E0308]: mismatched types
--> src/main.rs:12:13
|
12 | Animal::Cat(c) => f.write_str("c"),
| ^^^^^^^^^^^^^^ expected &Animal, found enum `Animal`
|
= note: expected type `&Animal`
= note: found type `Animal`
error[E0308]: mismatched types
--> src/main.rs:13:13
|
13 | Animal::Dog => f.write_str("d"),
| ^^^^^^^^^^^ expected &Animal, found enum `Animal`
|
= note: expected type `&Animal`
= note: found type `Animal`
Wie kann ich das ändern, dass der code, um es zu kompilieren? Ich habe versucht, das hinzufügen kaufmännische und-Zeichen in vielen verschiedenen Orten, ohne Glück. Ist es sogar möglich, ein match auf einen Verweis auf ein enum?
- Es ist auf der Rost-roadmap um die situation zu verbessern hier.
- Und wie der Rost 1.26 hat sich die situation verbessert, siehe Shepmaster Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als der Rost 1.26, die idiomatischen Weg ist die Weise, wie du es ursprünglich geschrieben da
match
Ergonomie wurden verbessert:ref
vor dem inneren Wertc
, wird es nicht die gleiche wie ohne (so lange, wie Sie entfernen die&
vor die enum-Variante). 2. Wenn Sie halten&
vor die enum-VarianteCat
aber entfernenref c
ist, wird es versuchen zu verschieben/kopieren der innere Wertc
! Für ein geliehenes Inhalt kann es nicht bewegen, und wird nicht kompiliert. 3. Sie können auch überspringen&mut
undref mut
im&mut Enum::Variant(ref mut value)
. Sie müssen noch schreiben*value = new_value
. Und sorry für die schlechte Formatierung durch Kommentar-Einschränkungen.Den idiomatischen Weg wäre
Können Sie
_
stattref c
zu schweigen, die "unbenutzt" - Warnung...
zu ignorieren, dass mehrere Werte.&
?Habe ich es herausgefunden danke an hilfreiche compiler-Meldungen: