【发布时间】:2021-03-01 22:21:25
【问题描述】:
我知道如何让代码工作我只是想知道为什么会这样。
假设以下程序:
fn dummy(name: String) {
let last_name = " Wang".to_string();
name.push_str(&last_name);
println!("Hello, {}", name);
}
fn main() {
println!("What is your name?");
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Couldn't read input!");
name.pop();
dummy(name);
}
尝试编译时出现以下错误:
error[E0596]: cannot borrow `name` as mutable, as it is not declared as mutable
--> print.rs:3:5
|
1 | fn dummy(name: String) {
| ---- help: consider changing this to be mutable: `mut name`
2 | let last_name = " Wang".to_string();
3 | name.push_str(&last_name);
| ^^^^ cannot borrow as mutable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0596`.
我知道只需在函数定义中在name 旁边添加mut 即可解决此问题,但是当变量name 之前在main 函数内部定义为可变时,为什么需要在函数定义中将其声明为可变?
编译器不应该知道变量之前是可变的吗?为什么它不能随之转移所有权和可变的“属性”?
也许这是个愚蠢的问题,但我是 Rust 的新手。如果它表现得如此,它会引入一些新问题/错误的可能性吗?如果有,你能举一些例子吗?
【问题讨论】:
-
可变性是变量级别的,而不是类型级别的,所以前面的可变性无关紧要。
name: String本质上的意思是“我要一个String,它是不可变的”