首页 > 解决方案 > 为什么 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)不应该默认存在吗?

标签: rust

解决方案


TL;DR:这是一个设计决策。Rust 编译器可以合理地推断出可变性是否必要;但是对于人类读者来说,这可能并不明显。


很长的故事

如果您查看 Rust 的前辈,您会发现 C++ 中引用参数的使用并未得到普遍认可。在 C++ 中:

foo.call(bar);

只有定义call才会让您知道bar是按值传递、常量引用还是可变引用。因此,Google 样式指南因强制对任何可修改的参数传递指针而臭名昭著,以便在调用端区分变量是否可以被调用修改。

在设计 Rust 时,我们一直在有意强调明确性。原因是代码的阅读次数多于编写次数,因此语法和语义应该针对阅读和理解进行优化。

明确性和简洁性之间存在张力,因此明确性并不总是首选,但经常是。

在可变引用的情况下,考虑到借用检查的规则以及可变借用对它们的影响,明确性是首选。


推荐阅读