似乎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使"未使用"警告静音.
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)
| 归档时间: |
|
| 查看次数: |
10539 次 |
| 最近记录: |