rust - ps4 - Coincidencia en una referencia a una enumeración
rust traduccion (2)
Parece que cada documento introductorio para los tipos de enumeración de Rust explica cómo hacer coincidir un objeto enum que usted posee . Pero, ¿qué ocurre si no posee el objeto enum y solo tiene una referencia con la que desea hacer coincidir? No sé cuál sería la sintaxis.
Aquí hay un código en el que intento hacer corresponder una referencia a una enumeración:
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);
}
The Rust Playground da errores en los primeros dos casos del partido al intentar compilarlo:
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`
¿Cómo puedo cambiar ese código para que compile? Traté de agregar símbolos en muchos lugares diferentes sin suerte. ¿Es posible igualar en una referencia a una enumeración?
La forma idiomática sería
match *self {
Animal::Cat(ref c) => f.write_str("c"),
Animal::Dog => f.write_str("d"),
}
Puede usar _
lugar de ref c
para silenciar la advertencia "sin usar".
Lo descubrí gracias a los útiles mensajes del compilador:
match self {
&Animal::Cat(ref c) => f.write_str("c"),
&Animal::Dog => f.write_str("d"),
}