繁体   English   中英

为什么 rust 在引用可变变量时重新声明可变性?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM