2016-04-13 15 views
19

Wygląda na to, że każdy dokument wprowadzający do Rusta enum types wyjaśnia, jak match na obiekcie wyliczeniowym, który jest właścicielem. Ale co, jeśli nie jesteś właścicielem obiektu enum i po prostu masz do niego odniesienie, z którym chcesz się dopasować? Nie wiem, jaka byłaby składnia.Dopasowanie w odniesieniu do enum

Oto kod, gdzie staram się dopasować w odniesieniu do wyliczenia:

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

Rust Playground daje błędy w dwóch pierwszych przypadkach meczu, gdy próbuje go skompilować:

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` 

Jak mogę zmienić ten kod, aby go skompilować? Próbowałem dodawać wzmacniacze w wielu różnych miejscach bez żadnego szczęścia. Czy można nawet dopasować odniesienie do wyliczenia?

+0

Jest na [mapie drogowej Rust] (https://github.com/rust-lang/rust-roadmap/issues/24) w celu poprawy sytuacji tutaj. –

Odpowiedz

17

idiomatyczne sposobem byłoby

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

Można użyć _ zamiast ref c uciszyć „nieużywany” ostrzeżenie.

+2

Lub '..', aby zignorować wiele wartości. – Shepmaster

+0

Czy jest jakaś różnica między tą i poniższą odpowiedzią (http://stackoverflow.com/a/36590693/86381), gdzie każda gałąź meczu jest poprzedzona przez '&'? – ehdv

+0

@ehdv Nie sądzę, ale jeszcze nie porównałem wygenerowanego zespołu. – WiSaGaN

8

I zdobione go dzięki pomocnych komunikatów kompilatora:

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