默认匹配绑定
你有过借用 Option<T>
然后进行匹配的经历嘛?你可能写成下面这样:
let s: &Option<String> = &Some("hello".to_string());
match s {
Some(s) => println!("s is: {}", s),
_ => (),
};
在 Rust 2015,这样写是错的,你必须这样写:
// Rust 2015
let s: &Option<String> = &Some("hello".to_string());
match s {
&Some(ref s) => println!("s is: {}", s),
_ => (),
};
在 Rust 2018, 对比之下,会自动推断 &
和 ref
,然后你再这样写就没问题了。
这个并不仅仅影响 match
,也会影响到很多地方,比如 let
表达式,闭包以及 for
循环。
更多的细节
模式的心理预期模型随着这种变化而略有改变,使其与语言的其他方面保持一致。
例如,在编写 for
循环时,您可以通过借用集合本身来迭代集合的借用内容:
let my_vec: Vec<i32> = vec![0, 1, 2];
for x in &my_vec { ... }
这个想法是 &T
可以被理解为 T
的借用视图,所以当你迭代,匹配或以其他方式构造一个 &T
时,你可以借用它的内部视图。
更正式地说,模式具有“绑定模式”,它可以是值( x
),引用( ref x
),也可以是可变引用( ref mut x
)。
在 Rust 2015 中,match
总是以by-value模式启动,并要求你在模式中显式写 ref
或 ref mut
以切换到借用模式。
在 Rust 2018 中,匹配的值的类型通知绑定模式,因此如果您使用 Some
变量匹配 &Option <String>
,您将自动进入 ref
模式,
为您提供借用查看内部数据。 类似地,&mut Option <String>
会给你一个 ref mut
视图。