【发布时间】:2015-08-22 03:22:15
【问题描述】:
为什么编译器会拒绝这段代码:
struct S<'a> {
i: i32,
r: &'a i32,
}
fn main() {
let mut s = S{i: 0, r: &0};
{
let m1 = &mut s;
m1.r = &m1.i;
}
let m2 = &mut s;
}
错误是:“不能一次多次借用 s 作为可变变量”(第一次借用:m1,第二次借用:m2)。
为什么s 的第一次借用在m1 超出范围后仍然存在?
我读到了超出原始借款人范围的借用范围扩展。然而,这似乎总是涉及“接管”原始借款的原始借款人范围之外的另一个借款人,例如此代码失败并出现完全相同的错误,这对我来说很清楚:
fn main() {
let mut s = 0;
let r: &mut i32;
{
let m1 = &mut s;
r = m1;
}
let m2 = &mut s;
}
在第一个示例中,如果我将 m1.r = &m1.i; 替换为 m1.r = &dummy;(虚拟定义为一些 &i32)或 let dummy = &m1.i;,则代码编译。仅当我将对某个字段的引用存储在借用结构的另一个字段中时,才会发生该错误。我不明白为什么这应该将借用扩展到其范围之外。
我对代码有什么问题的最佳猜测是:
s.r的原始生命周期是整个main,当我分配对
m1.r的引用时,它必须是原始生命周期,但&m1.i仅在m1生命周期内有效。
但我可能是错的(错误信息会误导人)。
【问题讨论】:
标签: rust