rust和可变性中的模式匹配


假设我有一个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