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

Dav*_*son 30 rust

似乎Rust的枚举类型的每个介绍性文档都解释了如何匹配拥有的枚举对象,但是如果您不拥有枚举对象并且您只是想要匹配它的引用呢?我不知道语法是什么.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

在尝试编译时,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`
Run Code Online (Sandbox Code Playgroud)

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

WiS*_*GaN 24

惯用的方式是

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

您可以使用_而不是ref c使"未使用"警告静音.

  • 我至少在一次代码中看到了其他答案可以正常编译,但是这个人会抱怨"不能摆脱借来的内容". (5认同)
  • 或者`..`忽略多个值. (4认同)

She*_*ter 16

从Rust 1.26开始,惯用的方式就是你最初编写它的方式, 因为match人体工程学得到了改进:

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);
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 11

由于有用的编译器消息,我想通了:

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