假设我有一个Option<String>
,并且想要进行模式匹配以获得对该String
的可变引用。我可以做以下事情(_a
需要是可变的):
let mut _a: Option<String> = Some(String::from("foo"));
if let Some(ref mut aa) = _a {
aa.push_str("_");
println!("aa: {:?}", aa)
}
现在假设我有两个要进行模式匹配的Option<String>
值。
let _b: Option<String> = Some(String::from("bar"));
let _c: Option<String> = Some(String::from("baz"));
if let (Some(ref mut bb), Some(ref mut cc)) = (_b, _c) {
bb.push_str("_");
cc.push_str("_");
println!("bb: {:?}, cc: {:?}", bb, cc);
}
奇怪的是,我可以在模式中使用ref mut
,即使_b
和_c
都不是可变的,而且我可以改变字符串。为什么在这种情况下这是允许的?我希望这不会被编译,除非_b
和_c
都被声明为可变的,类似于上面的第一个例子。
我认为可能发生的事情是在模式匹配中构造一个元组,即(_b, _c)
,然后一些编译器魔术允许在“绑定”到这个元组的模式上使用ref mut
。对吗?
Rust版本:
rustc 1.41.1 (f3e1a954d 2020-02-24)
转载请注明出处:http://www.yinxuebaozhuang.com/article/20230526/1681182.html