rust - 为什么 rust 在引用可变变量时会重新声明可变性?
问题描述
我正在阅读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()
,但在下一行,参数 forread_line()
也有一个mut
关键字。
如果变量一开始就被定义为可变的,那么我们为什么要mut
再次使用而不是像这样使用引用:
io::stdin().read_line(&guess).expect("Failed to read line");
如果为变量定义了类型,那么当我们使用引用时,类型(mut
)不应该默认存在吗?
解决方案
TL;DR:这是一个设计决策。Rust 编译器可以合理地推断出可变性是否必要;但是对于人类读者来说,这可能并不明显。
很长的故事
如果您查看 Rust 的前辈,您会发现 C++ 中引用参数的使用并未得到普遍认可。在 C++ 中:
foo.call(bar);
只有定义call
才会让您知道bar
是按值传递、常量引用还是可变引用。因此,Google 样式指南因强制对任何可修改的参数传递指针而臭名昭著,以便在调用端区分变量是否可以被调用修改。
在设计 Rust 时,我们一直在有意强调明确性。原因是代码的阅读次数多于编写次数,因此语法和语义应该针对阅读和理解进行优化。
明确性和简洁性之间存在张力,因此明确性并不总是首选,但经常是。
在可变引用的情况下,考虑到借用检查的规则以及可变借用对它们的影响,明确性是首选。
推荐阅读
- continuous-integration - Chef 服务器可以有多个工作站吗?
- powershell - 在第一个进程完成后运行两个自动退出批处理而不退出命令提示符
- python - 使用 Python 解析 YAML 文件,以提取唯一/非唯一关键字对之间的文本块
- python - 使用 python 将自动录音转换为文本
- react-native - React Native 使用 IOS 的 Jar 库
- hyperledger-fabric - hyperledger:创建通道配置事务时出错
- php - Yii2 内置服务器从 index.php 开始
- javascript - 寻找参数变化的值范围的可能排列
- ios - iOS 使用预签名链接将文件上传到 Amazon S3(来自后端)但下载文件后会损坏
- sketch-3 - 使圆圈褪色?