[英]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
。
self
匹配,并在每个模式前加上&
前缀&
以“破坏”参考。
fn tail(&self) -> Option<&Foo> { match self { &Cons(_, ref item) => Some(item), &Nil => None, } }
在*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.