首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对模式的引用与取消引用的值之间的匹配有什么区别吗?

对模式的引用与取消引用的值之间的匹配有什么区别吗?
EN

Stack Overflow用户
提问于 2017-04-12 12:50:08
回答 1查看 477关注 0票数 2

克里皮对这样的代码发出警告:

代码语言:javascript
复制
fn func<T>(data: &Option<T>) {
    if let &Some(ref value) = data {}
}
代码语言:javascript
复制
warning: you don't need to add `&` to all patterns
 --> src/main.rs:2:5
  |
2 |     if let &Some(ref value) = data {}
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(match_ref_pats)] on by default
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.210/index.html#match_ref_pats
help: instead of prefixing all patterns with `&`, you can dereference the expression
  |
2 |     if let Some(ref value) = *data {}
  |            ^^^^^^^^^^^^^^^   ^^^^^

从编译器的角度来看,这些构造是否相同:

代码语言:javascript
复制
if let &Some(ref value) = data {
代码语言:javascript
复制
if let Some(ref value) = *data {

如果是这样的话,那么使用统一风格的克里皮消息有什么意义呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-12 13:01:50

是的,这对编译器来说是一样的。在这种情况下,没有什么好处。真正的好处来自于match等价物:

代码语言:javascript
复制
fn func(data: &Foo) {
    match data {
        &Foo::One => {}
        &Foo::Two => {}
        &Foo::Three => {}
    }
}

在这里,您只需要在模式中放置一个取消引用,而不是3个引用:

代码语言:javascript
复制
fn func(data: &Foo) {
    match *data {
        Foo::One => {}
        Foo::Two => {}
        Foo::Three => {}
    }
}

从Rust 1.26开始,您甚至不必取消匹配表达式的引用:

代码语言:javascript
复制
fn func(data: &Foo) {
    match data {
        Foo::One => {}
        Foo::Two => {}
        Foo::Three => {}
    }
}

这就是为什么这是惯用的选择。

if let概念只是对此的一个扩展。

你不能总是放弃这个价值。如果您试图对一对项目执行相同的操作:

代码语言:javascript
复制
fn func(data: &Foo, data2: &Foo) {
    match (*data, *data2) {
        (Foo::One, _) => {}
        (Foo::Two, _) => {}
        (Foo::Three, _) => {}
    }
}

你得到了错误

代码语言:javascript
复制
error[E0507]: cannot move out of borrowed content
 --> src/main.rs:8:12
  |
8 |     match (*data, *data2) {
  |            ^^^^^ cannot move out of borrowed content

在这种情况下,您可以使用参考表格:

代码语言:javascript
复制
fn func(data: &Foo, data2: &Foo) {
    match (data, data2) {
        (&Foo::One, _) => {}
        (&Foo::Two, _) => {}
        (&Foo::Three, _) => {}
    }
}

或者,从Rust 1.26开始,执行一些隐式引用:

代码语言:javascript
复制
fn func(data: &Foo, data2: &Foo) {
    match (data, data2) {
        (Foo::One, x) => {}
        (Foo::Two, _) => {}
        (Foo::Three, _) => {}
    }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43370054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档