如何在 Rust 中借用可变与不可变?

Sep*_*eed 6 mutable rust borrowing

我已经阅读了这些文档:https : //doc.rust-lang.org/rust-by-example/scope/borrow/mut.html

我也读过这个问题:(不能将不可变的借用内容作为可变借用


这些文档帮助我理解了如何将借用声明为可变的(我认为):

let mut (part1, part2) = someTuple;
Run Code Online (Sandbox Code Playgroud)

但是我一直无法找到关于什么是不可变的借用的明确说明。这是我的猜测:

let (part1, part2) = someTuple;
Run Code Online (Sandbox Code Playgroud)

我知道这是一个非常基本的问题,但谷歌搜索让我深入到解释的深处,我仍然试图在最简单的上下文中找到我的方向。

我如何在 Rust 中借用可变和不可变?

Ejd*_*ien 9

let x = 0;
let immutable_borrow = &x; //borrow as immutable

//to borrow as mutable the variable needs to be declared as mutable
let mut y = 1;
let mutable_borrow = &mut y; //borrow as mutable
Run Code Online (Sandbox Code Playgroud)

注意 1:您可以在同一范围内借用不可变或可变的变量,这意味着您不能这样做:

let mut x = 0;
let immutable_borrow = &x;
let mutable_borrow = &mut x;
Run Code Online (Sandbox Code Playgroud)

为什么?

因为如果您对同一变量有可变和不可变引用,那么该变量的数据可能会通过该可变引用而更改,这可能会导致很多问题。


注 2:你可以无限次地不可变地借用一个变量,但你只能可变地借用一个变量一次。

//You can do this
let x = 0;
let x1 = &x;
let x2 = &x;
//...

//But you can't do this
let mut y = 0;
let y1 = &mut y;
let y2 = &mut y; //won't compile if you use y1 after you declare y2
Run Code Online (Sandbox Code Playgroud)

为什么?

正如刚才提到的。一个可变引用可能会在其他所有可变引用不知情的情况下更改它们所指向的数据。这可能会导致很多问题。但是拥有多个不可变引用是可以的,因为数据不会被意外更改。