繁体   English   中英

Rust模式匹配如何确定绑定变量是引用还是值?

[英]How does Rust pattern matching determine if the bound variable will be a reference or a value?

use crate::List::{Cons, Nil};

#[derive(Debug)]
struct Foo {}

#[derive(Debug)]
enum List {
    Cons(i32, Foo),
    Nil,
}

impl List {
    fn tail(&self) -> Option<&Foo> {
        match self {
            Cons(_, item) => Some(item), // why `item` is of type `&Foo`?
            Nil => None,
        }
    }
}

如评论所述,为什么&Foo类型的item 有什么规则说item将是&Foo类型而不是Foo类型?

我知道,将项目设为Foo是没有意义的; &self表示self是参考,因此将值从参考中移出没有任何意义,但是是否有任何明确定义规则的规范?

RFC 2005(又称匹配人体工程学引入了该规则。

在实施更改之前,有两种方法可以编写此match

  1. self匹配,并在每个模式前加上&前缀&以“破坏”参考。

     fn tail(&self) -> Option<&Foo> { match self { &Cons(_, ref item) => Some(item), &Nil => None, } } 
  2. *self上匹配,并且不要在每个模式前加上&前缀(因为*self不是参考)。

     fn tail(&self) -> Option<&Foo> { match *self { Cons(_, ref item) => Some(item), Nil => None, } } 

然而,在两种情况下,我们都需要编写ref item ,否则我们将得到error[E0507]: cannot move out of borrowed content

但是,在您编写的match ,要匹配的表达式是一个引用(类型&List ),但是这些模式不是引用模式(如上述1.)。 这是匹配人机工程学的起点:规则说,当引用与非引用模式匹配时,该模式内的绑定通过引用而不是按值绑定(即好像它们以ref前缀)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM