2016-04-13 12 views
19

Es scheint wie jedes einführende Dokument für Rust enum types erläutert, wie match auf einem Enum-Objekt, dass Sie eigene. Aber was, wenn Sie das enum-Objekt nicht besitzen und Sie nur einen Verweis darauf haben, mit dem Sie übereinstimmen wollen? Ich weiß nicht, wie die Syntax sein würde.Passend zu einem Verweis auf ein Enum

Hier ist ein Code, wo ich versuche, auf den Verweis auf einen Enum zum Spiel:

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); 
} 

Die Rust Playground Fehler auf den ersten beiden Fällen des Spiels gibt, wenn man versucht, 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 diesen Code ändern, damit er kompiliert wird? Ich habe versucht, kaufmännische Und-Zeichen in vielen verschiedenen Orten ohne Glück hinzuzufügen. Ist es überhaupt möglich, einen Bezug zu einer Enum zu finden?

+0

Es ist auf der [Rost Roadmap] (https://github.com/rust-lang/rust-roadmap/issues/24), um die Situation hier zu verbessern. –

Antwort

17

Der idiomatische Weg

match *self { 
    Animal::Cat(ref c) => f.write_str("c"), 
    Animal::Dog => f.write_str("d"), 
} 

Sie _ statt ref c verwenden kann, wäre die „ungenutzt“ Warnung zum Schweigen zu bringen.

+2

Oder '..', um mehrere Werte zu ignorieren. – Shepmaster

+0

Gibt es einen Unterschied zwischen dieser und der Antwort unten (http://stackoverflow.com/a/36590693/86381), wo jedem Zweig der Übereinstimmung vorangestellt wird "&"? – ehdv

+0

@ehdv Das würde ich nicht denken, aber ich habe die generierte Baugruppe noch nicht verglichen. – WiSaGaN

8

Habe ich es dank hilfreichen Compiler-Meldungen aus:

match self { 
    &Animal::Cat(ref c) => f.write_str("c"), 
    &Animal::Dog => f.write_str("d"), 
}