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
之前被借用了一段时间。