Rust 从可变引用中重新借用共享引用

Rust Reborrowing Shared Reference from Mutable Reference

提问人:mishar 提问时间:8/31/2023 更新时间:8/31/2023 访问量:34

问:

我是 Rust 的新手,并试图理解为什么对借用元素的数据结构的可变引用似乎可以在同一生命周期内再次用于借用另一个元素。这是关于 O'Reilly 关于 Rust 的书中的一个例子,它让我有些困惑:

let mut v = (136, 139);
let m = &mut v;
let m0 = &mut m.0;   //ok: reborrowing mutable from mutable
*m0 = 137;
let r1 = &m.1;       //ok: reborrowing shared from mutable,
                     //and doesn't overlap with m0
v.1;                 //error: access through other paths still forbidden
println!("{}", r1);  //r1 gets used here

书中提到:

在可变引用的整个生命周期中,没有其他可用路径可以到达其引用对象或从那里可访问的任何值。唯一生存期可能与可变引用重叠的引用是从可变引用本身借用的引用。

然后,本书给出了一个图表(“所有权树”),显示了一个值树(通过该树,子节点可以通过父节点引用,引用允许,例如具有数据结构的元素,其中该元素是子节点,父节点是数据结构),并给出了一个可变引用,因为从它上面的引用路径必须是不可访问的, 以及那些对于它的所指和它下面的人,只能通过它访问。同样,对于共享引用,给出了一个类似的树形图,该树形图显示了从它向上的路径上的所有引用,这些引用可以使用该路径引用它,因为必须是只读的,以及该引用和可从它访问的引用是只读的。

所以让我感到困惑的是上面 () 的第 5 行,以及为什么没关系。我相信我理解简单地借用 ,这很好;但随后借用(或者这在技术上是来自?),我认为根据上面的引用和树形图的解释,这意味着在生命周期结束之前不能在这里再次使用,因为指的是内存中的数据结构在概念路径上从“所有权树”中向上。(即,的值可以从 中获取。let r1 = &m.1;mvm0m.0mmm0mm0m0m

总而言之,我认为在上面的第 3 行借用后,这里不能再次使用,但它在上面的第 5 行中可供参考。我试图理解为什么这没关系。我有一种感觉,这是因为上面引用的最后一行关于“谁的一生可能会重叠”,但仍然感觉有些矛盾。在上面的评论中,它读作“并且不与”重叠“,即使可以同时到达两者,因此出现在”所有权树“的上方,因此我认为不可用/无法访问(从而阻止通过第 5 行中的访问)而可变引用是活的。mm0m.1m0mm.0m.1m.1m.0

辈子 借用检查器 所有权 可变引用

答:

1赞 cafce25 8/31/2023 #1

正如你自己所引用的

唯一生存期可能与可变引用重叠的引用是从可变引用本身借用的引用。

您是从可变引用中借用的,所以这很好。不,它在哪里说你只能从中借钱,而且你并不像你所证明的那样。

换句话说,你可以随心所欲地从可变引用中借用,它们甚至强制使用共享引用。

由于非词法生存期,即使它借用了与 PitaJ 指出的相同的部分,也不必超出可重借的范围,但它甚至没有这样做,因此编译器能够拆分借用m0mr1