[英]Why does rust re-declare mutability when taking a reference to a mutable variable?
我正在阅读The Rust Programming Language 的第二章,我不明白的东西在这里引起了我的注意:
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
在代码第 5 行,它用let mut guess = String::new()
声明了一个可变变量,但在下一行read_line()
的参数也有一个mut
关键字。
如果变量首先被定义为可变的,那么为什么我们再次使用mut
而不是像这样只使用引用:
io::stdin().read_line(&guess).expect("Failed to read line");
如果为变量定义了类型,那么当我们使用引用时,类型( mut
)不应该默认存在吗?
因为您可以拥有对可变变量的不可变引用或对可变变量的可变引用。 关键字mut
选择您要创建的引用类型。
let mut foo = 1;
example1(&foo); // May not modify `foo`
example2(&mut foo); // May modify `foo`
也可以看看:
TL;DR:这是一个设计决定。 Rust 编译器可以合理地推断是否需要可变性; 然而,对于人类读者来说,这可能并不明显。
很长的故事
如果您查看 Rust 的前辈,您会发现在 C++ 中使用引用参数并没有得到普遍赞赏。 在 C++ 中:
foo.call(bar);
只有call
的定义会让你知道bar
是按值、常量引用还是可变引用传递。 因此, 谷歌风格指南因强制任何可修改参数传递指针而臭名昭著,以便在调用端区分变量是否可以被调用修改。
在设计 Rust 时,有大量且刻意的强调明确性。 原因是代码的阅读次数比编写次数多,因此应优化语法和语义以进行阅读和理解。
明确性和简洁性之间存在张力,因此明确性并不总是首选,但通常是。
在可变引用的情况下,考虑到有关借用检查的规则以及可变借用对它们的影响,明确性是首选。
请记住,默认情况下,在 Rust 中所有的都是不可变的,当您通过使用&
创建对某事物的引用时,默认情况下这会创建对某事物的引用不可变,至少对于引用而言,值本身是可变的,真正的可变状态是价值并不重要。
当您来自一切都是可变的语言时,这有点违反直觉。 您无需明确说明某些内容是可变的,这是默认行为。 当我们创建某个东西时,需要明确地写出对某个东西的引用是不可变的,这几乎不存在。
因此,要创建对可变内容的引用,必须明确使用&mut
。 这是一个规则,编译器知道该值可以改变并且可以为你做,但 Rust 要求你明确地编写它,就这么简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.