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

时间:2019-08-14 08:07:57

标签: rust mutability

我有以下代码:

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而不是vec.get_mut而不使用letlet mut时为什么不起作用?< / li>
  • 为什么vec不能以相同的方式工作,即当我使用let vec = Vec::new()时,为什么不能给vec.push()打电话?

1 个答案:

答案 0 :(得分:2)

vec.get_mut(0)返回一个Option<&mut String>,因此当您unwrap该值时,将有一个可变的借用String。请记住,let语句的左侧正在使用模式匹配,因此,当您的 pattern 只是一个变量名称时,您实际上会说匹配右边的任何内容,并将其称为 name < / em>。因此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);
}