为什么保存 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
而不是 vec.get_mut
时,为什么 不起作用,无论我使用 let
还是 let mut
?
- 为什么
vec
的工作方式不同,即当我使用 let vec = Vec::new()
时,为什么我不能调用 vec.push()
?
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);
}
我有以下代码:
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
? - 为什么
vec
的工作方式不同,即当我使用let vec = Vec::new()
时,为什么我不能调用vec.push()
?
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);
}