对枚举的引用匹配的语法是什么?

时间:2016-04-13 06:44:10

标签: rust

看起来Rust的enum types的每个介绍性文档都解释了如何在拥有的枚举对象上match,但如果您不拥有枚举对象,那该怎么办?你只想提到一个你要匹配的引用?我不知道语法是什么。

以下是我尝试匹配枚举引用的一些代码:

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在尝试编译匹配的前两种情况时会出错:

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`

如何更改代码以使其编译?我尝试在很多不同的地方添加&符号而没有任何运气。甚至可以匹配对枚举的引用吗?

3 个答案:

答案 0 :(得分:20)

习惯的方式是

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

您可以使用_代替ref c来消除"未使用的"警告。

答案 1 :(得分:11)

从Rust 1.26开始,惯用的方式是您最初编写的方式 because match ergonomics have been improved

use std::fmt;

pub enum Animal {
    Cat(String),
    Dog,
}

impl fmt::Display for Animal {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Animal::Cat(_) => f.write_str("c"),
            Animal::Dog => f.write_str("d"),
        }
    }
}

fn main() {
    let p: Animal = Animal::Cat("whiskers".to_owned());
    println!("{}", p);
}

答案 2 :(得分:9)

我想通过有用的编译器消息来理解它:

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