什么时候同时拥有可变和不可变真的是一个问题?

问题描述 投票:0回答:1

我已经使用 Rust 一段时间了。这很难,很新,很令人兴奋,而且编译器非常有帮助。所以我通常会得到工作代码。但有一个问题我根本不明白。这就是为什么拥有多个可变引用,或者一些不可变引用和一个可变引用是一个问题?

首先,在顺序执行的程序中,我不认为这会成为问题。假设我有两个引用,无论是可变的还是不可变的。在任何时间点,只有一件事会使用该引用。当然,可能会改变,但我不明白这里会如何出现内存不安全。 这可能以任何方式相关的唯一方式(我可以想象)是当我们引入多个线程时。我会更放心地知道所有这些都只读取数据,因为在我读取数据时,其他线程无法篡改该值。这个假设正确吗?整个可变性处理是否仅与多线程上下文相关(除了在其他语言中也发现的代码可预测性,例如 JS 中的

let

const
)?如果不是,顺序程序怎么会因为数据不应该可变而陷入麻烦(如 Rust 所见)?
第二个问题似乎更引人注目:当然,我一次只能有一个可变引用,或者在拥有不可变引用的同时没有一个可变引用。但数据的所有者仍然存在!他可以随时改变它,特别是当另一个生成的线程通过不可变引用读取数据时(如果可能的话,我对此表示怀疑,因为生命周期检查)。当所有者仍然保留改变数据的权利时,通过禁止对其他引用数据的可变引用来增加什么样的安全性?

如您所见,这些问题对于我理解 Rust 在内存安全方面添加的内容非常重要。不幸的是,我没有找到任何明确的解释为什么要这样做,只有

that

rust memory-management
1个回答
0
投票

def remove_unexpected_element(sequence, unexpected): for elem in sequence: if elem == unexpected: sequence.remove(elem) seq = [10, 10, 20, 20, 30, 30] remove_unexpected_element(seq, 20) print(seq) # [10, 10, 20, 30, 30]

了解 Python 中序列迭代的详细信息的程序员可能会第一眼发现这是不正确的。
但如果我们不知道这些细节,我们就不知道这段代码是否执行了它看起来的操作。

对于第二点,可变引用与其引用的可变值同时存在,但是在使用该引用的代码段中,无法直接访问该值。 这正是借用支票所负责的。

© www.soinside.com 2019 - 2024. All rights reserved.