为什么保存 Vec::get_mut 结果的变量不需要可变?

Why does a variable holding the result of Vec::get_mut not need to be mutable?

我有以下代码:

fn main() {
    let mut vec = Vec::new();
    vec.push(String::from("Foo"));
    let mut row = vec.get_mut(0).unwrap();
    row.push('!');
    println!("{}", vec[0])
}

它打印出 "Foo!",但编译器告诉我:

warning: variable does not need to be mutable
 --> src/main.rs:4:9
  |
4 |     let mut row = vec.get_mut(0).unwrap();
  |         ----^^^
  |         |
  |         help: remove this `mut`

令人惊讶的是,删除 mut 有效。这提出了几个问题:

vec.get_mut(0) returns 一个 Option<&mut String>,所以当你 unwrap 这个值时,你将有一个 String 的可变借用。请记住,let 语句的左侧使用的是模式匹配,因此当您的 pattern 只是一个变量名时,您实际上说匹配右侧的任何内容并将其命名为 姓名。因此 row 匹配 &mut String 所以它已经是可变的。

这里有一个更简单、更直接的例子来说明这个问题(你可以在 playground 中尝试):

fn main() {
    let mut x = 55i32;
    dbg!(&x);
    let y = &mut x; // <-- y's type is `&mut i32`
    *y = 12;
    dbg!(&x);
}