从可变借用的结构中可变借用字段

Iza*_*ana 1 rust

从借用规则来看:

  • 在任何给定时间,您可以拥有一个可变引用或任意数量的不可变引用。

下面,我有一个 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)

我知道我们可以对结构绑定进行不相交的可变借用(分割借用引用),但我不确定分割对结构的引用是否违反了借用规则。

澄清:上面的代码可以编译。我的困惑是,由于上述原因,它不应该编译。(游乐场


我发现这个链接相关。

当您可变地借用结构时,您就可以自由地可变地借用任何子元素。

但我找不到任何文档来支持它。

Sve*_*ach 5

线路

\n
let bar = &mut foo.a;\n
Run Code Online (Sandbox Code Playgroud)\n

创建的字段的重新借用。只要重新借用有效,该字段就不能再通过访问,而只能通过 访问。上次使用后,可以再次使用 \xe2\x80\x93,一旦重借被释放,原来的借用又可以使用。afoofoo.abarbarfoo.a

\n

再借款与借款本身非常相似。借用值时,您无法访问原始值,直到借用被释放。重新借用时也会发生同样的情况。这确保在任何给定时间只有一个活动的可变借用,并且借用规则得到维护。

\n

您在这里处理结构的事实是偶然的。您可以对任何值的可变借用执行相同的操作,例如之后

\n
let 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

的值为i42。此代码看起来有多个活动的可变借用i。然而,在任何给定时间只能使用其中之一。重新借用在最后一次使用后被释放,因此原始借用再次可用。如果我们交换此代码中的最后两行,它将不再编译,因为在borrow访问时重新借用仍然有效,这是不允许的。

\n

不幸的是,Rust 参考文献中目前没有记录重新借用的机制。一个相关的、也没有很好记录的主题是当可变引用绑定到已知为可变引用的类型的变量时,会发生隐式重新借用。

\n