【发布时间】:2021-09-03 07:26:35
【问题描述】:
tl;dr 给定pub fn func(&'a mut self),为什么self 在func 运行后被认为是“可变借用”?
鉴于以下最小可行示例 (playground)
pub struct Struct1<'a> {
var: &'a u8,
}
impl<'a> Struct1<'a> {
pub fn new() -> Struct1<'a> {
return Struct1 {
var: &33,
}
}
pub fn func(&'a mut self) -> () {
()
}
}
fn main() {
let mut s1 = Struct1::new();
s1.func(); // point 1
// point 2
s1.func(); // point 3
}
导致编译器错误
error[E0499]: cannot borrow `s1` as mutable more than once at a time
--> src/test12-borrow-mut-struct-twice-okay.rs:20:5
|
18 | s1.func(); // point 1
| -- first mutable borrow occurs here
19 | // point 2
20 | s1.func(); // point 3
| ^^
| |
| second mutable borrow occurs here
| first borrow later used here
然而,// point 2 s1 在我看来不再被借用了。 func 已完成运行。 func 内还有什么可以借用 self!?看来func //point 1 已放弃对s1 的控制。
s1// point 3 还借用什么?
类似问题:
【问题讨论】:
-
我知道有类似的问题。大多数这些问题都集中在解决特定问题上。然而,我希望一些防锈专家能够果断地回答更广泛的问题。
-
它仍然是借用的,因为 you 告诉编译器您正在借用
'a生命周期,该生命周期定义在impl块上,即'a生命周期与结构有关。您的&'a mut self脱糖到self: &'a mut Struct<'a>。 -
@DenysSéguret 好的,我会充实答案。
-
感谢@DenysSéguret。事实上,这个问题潜伏在许多 SO
rust问题中。然而,他们中的大多数人在试图解决其他问题时以一种复杂的方式触及它。我想把它提炼成最简单的形式,并专注于潜在的 rust 概念,这样我就可以理解如何解决它的所有形式,而不是仅仅复制+粘贴某人的代码建议。 -
@DenysSéguret this one 似乎是一个更直接的复制品,但反过来问这个问题很难找到。当然,“第二个可变借用发生在这里”与数百万个与函数原型错误无关的问题相匹配。
标签: rust