如何在 Rust 中制作指向可变数据的不可变变量

Dab*_*ber 0 rust

我在理解如何实现以下目标时遇到了麻烦:我想要一个对我无法更改的向量的引用,其中包含我可以更改的数据(c++ T* const 等效)这是否可以在 rust 语法中实现?

let mut a = Vec::new()
a.push(1) // should be allowed
a = Vec::new() // should be disallowed.
Run Code Online (Sandbox Code Playgroud)

mut 似乎允许两个级别的可变性

har*_*mic 7

这个:

let mut a = Vec::new()
Run Code Online (Sandbox Code Playgroud)

不创建对向量的引用;而是创建一个绑定到向量本身的变量。它相当于 C++ 中的这个:

std::vector<int> a;
Run Code Online (Sandbox Code Playgroud)

如果你想要一个对可变向量的不可变引用,你会有这样的事情:

let mut a = vec![1,2,3];

let r = &mut a;
r.push(4);
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,r是一个绑定到可变向量引用的不可变变量a。如果您尝试重新分配r为对另一个向量的引用:

let mut b = vec![4,5,6];

r=&mut b;
r.push(7);
Run Code Online (Sandbox Code Playgroud)

你会得到这个错误:

9 |     r=&mut b;
  |     ^^^^^^^^ cannot assign twice to immutable variable
Run Code Online (Sandbox Code Playgroud)

操场

但是请注意,由于 Rust 允许阴影,您可以使用 'let' 创建一个新绑定,在同一范围内阴影旧绑定,因此您可以这样做:

9 |     r=&mut b;
  |     ^^^^^^^^ cannot assign twice to immutable variable
Run Code Online (Sandbox Code Playgroud)