从借用规则来看:
下面,我有一个 Foo 结构(整个结构)的可变借用,这意味着我借用了该结构的每个字段。不过,我可以在功能上再借用一下它的领域demo
。我怀疑我有两个可变引用x.a
:
#[derive(Debug)]
struct Foo {
a: i32,
b: i32,
}
fn demo(foo: &mut Foo) {
// the `foo` is mutable borrow
// should have exclusive access to all elements of Foo instance
// However,
let bar = &mut foo.a; // second ref to `x.a`
*bar += 1;
let baz = &foo.b;
println!("{:?}", bar);
println!("{:?}", baz);
}
fn main() {
let mut x = Foo { a: 10, b: 1 };
let foo = &mut x; // ref to x, implies borrowing x.a and x.b
demo(foo);
}
Run Code Online (Sandbox Code Playgroud)
我知道我们可以对结构绑定进行不相交的可变借用(分割借用引用),但我不确定分割对结构的引用是否违反了借用规则。
澄清:上面的代码可以编译。我的困惑是,由于上述原因,它不应该编译。(游乐场)
我发现这个链接相关。
当您可变地借用结构时,您就可以自由地可变地借用任何子元素。
但我找不到任何文档来支持它。
线路
\nlet bar = &mut foo.a;\n
Run Code Online (Sandbox Code Playgroud)\n创建的字段的重新借用。只要重新借用有效,该字段就不能再通过访问,而只能通过 访问。上次使用后,可以再次使用 \xe2\x80\x93,一旦重借被释放,原来的借用又可以使用。a
foo
foo.a
bar
bar
foo.a
再借款与借款本身非常相似。借用值时,您无法访问原始值,直到借用被释放。重新借用时也会发生同样的情况。这确保在任何给定时间只有一个活动的可变借用,并且借用规则得到维护。
\n您在这里处理结构的事实是偶然的。您可以对任何值的可变借用执行相同的操作,例如之后
\nlet mut i = 17;\nlet borrow = &mut i;\nlet reborrow = &mut *borrow;\n*reborrow += 4;\n*borrow += 21;\n
Run Code Online (Sandbox Code Playgroud)\n的值为i
42。此代码看起来有多个活动的可变借用i
。然而,在任何给定时间只能使用其中之一。重新借用在最后一次使用后被释放,因此原始借用再次可用。如果我们交换此代码中的最后两行,它将不再编译,因为在borrow
访问时重新借用仍然有效,这是不允许的。
不幸的是,Rust 参考文献中目前没有记录重新借用的机制。一个相关的、也没有很好记录的主题是,当可变引用绑定到已知为可变引用的类型的变量时,会发生隐式重新借用。
\n