我有以下代码:
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
而不使用let
或let mut
时为什么不起作用?< / li>
vec
不能以相同的方式工作,即当我使用let vec = Vec::new()
时,为什么不能给vec.push()
打电话?答案 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);
}