是的,这些对于编译器来说是一样的。在this的话,并没有太大的好处。真正的好处来自于match
相等的:
fn func(data: &Foo) {
match data {
&Foo::One => {}
&Foo::Two => {}
&Foo::Three => {}
}
}
在这里,您只需在模式中放置一个取消引用,而不是 3 个引用:
fn func(data: &Foo) {
match *data {
Foo::One => {}
Foo::Two => {}
Foo::Three => {}
}
}
从 Rust 1.26 开始,您甚至不必取消引用匹配的表达式:
fn func(data: &Foo) {
match data {
Foo::One => {}
Foo::Two => {}
Foo::Three => {}
}
}
这就是为什么它是惯用的选择。
The if let
概念只是此的延伸。
您不能总是取消引用该值。如果您尝试对一对项目执行相同的操作:
fn func(data: &Foo, data2: &Foo) {
match (*data, *data2) {
(Foo::One, _) => {}
(Foo::Two, _) => {}
(Foo::Three, _) => {}
}
}
你得到错误
error[E0507]: cannot move out of borrowed content
--> src/main.rs:8:12
|
8 | match (*data, *data2) {
| ^^^^^ cannot move out of borrowed content
在这种情况下,您可以使用参考表格:
fn func(data: &Foo, data2: &Foo) {
match (data, data2) {
(&Foo::One, _) => {}
(&Foo::Two, _) => {}
(&Foo::Three, _) => {}
}
}
或者,从 Rust 1.26 开始,执行一些隐式引用:
fn func(data: &Foo, data2: &Foo) {
match (data, data2) {
(Foo::One, x) => {}
(Foo::Two, _) => {}
(Foo::Three, _) => {}
}
}