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

Rust 为什么保存Vec::get_mut结果的变量不需要是可变的?,rust,mutability,Rust,Mutability,我有以下代码: fn main(){ 让mut-vec=vec::new(); 向量推送(字符串::from(“Foo”); 让mut row=vec.get_mut(0.unwrap(); 行。推(“!”); println!(“{}”,vec[0]) } 它输出“Foo!”,但编译器告诉我: 警告:变量不需要是可变的 -->src/main.rs:4:9 | 4 |让mut row=vec.get_mut(0).unwrap(); | ----^^^ | |

我有以下代码:

fn main(){
让mut-vec=vec::new();
向量推送(字符串::from(“Foo”);
让mut row=vec.get_mut(0.unwrap();
行。推(“!”);
println!(“{}”,vec[0])
}
它输出“Foo!”,但编译器告诉我:

警告:变量不需要是可变的
-->src/main.rs:4:9
|
4 |让mut row=vec.get_mut(0).unwrap();
|         ----^^^
|         |
|帮助:删除此“mut”`
令人惊讶的是,删除
mut
是有效的。这引发了几个问题:

  • 为什么这样做有效
  • 为什么当我使用
    vec.get
    而不是
    vec.get_mut
    时,不管我是使用
    let
    还是
    let mut
    ,这都不起作用
  • 为什么
    vec
    不能以同样的方式工作,即当我使用
    let vec=vec::new()
    时,为什么我不能调用
    vec.push()
vec.get_mut(0)
返回一个
选项
,因此当您
展开该值时,您将有一个
字符串的可变借用。请记住,
let
语句的左侧使用模式匹配,因此,当模式只是一个变量名时,您基本上会说匹配右侧的任何内容,并将其命名。因此,
&mut字符串
匹配,因此它已经是可变的

下面是一个更简单、更直观的示例来说明该案例(您可以在中尝试):

fn main(){
设mut x=55i32;
dbg!(&x);

让y=&mut x;//看起来它实际上是在返回到
vec
之前被借用了一段时间。